-
這個是用 C 語言寫的。
#include
#include
#define x
#define n 100
#define y
int kuaipai(char *a,int i,int j,int *k) 快速排序功能
char v;
int i=i;
int j=j;
v=*(a+(i+j)/2);
while(1)
while(iv)
i++;while(j>i&&*a+j)j)
break;
if(i= end) {
else {
int pivot = a[end];
int result = getpivot(begin, end, pivot);
quicksort(begin, result - 1);
quicksort(result + 1, end);
private int getpivot(int begin, int end, int pivot) {
begin = begin - 1;
int o = end;
while (true) {
while (a[++begin] while (end > 0 &&a[--end] >pivot) {
if (begin >= end) {
break;
else {
swap(begin, end);
swap(begin, o);
return begin;
private void swap(int begin, int end) {
int t = a[begin];
a[begin] = a[end];
a[end] = t;
public int geta()
return a;
public void seta(int a) {
a;
-
第一排是67、50、65、75、78、56、89,第二排是50、65、67、75、56、78、89,第三排是50、65、67、56、75、78、89,第四排是50、65、56、67、75、78、89,第五排是50、56、65、67、75、78、89
-
1.堆排序是指利用堆樹(Heap)的資料結構設計的一種排序演算法,是一種選擇排序。 您可以使用陣列的特徵來快速定位指定索引的元素。 堆分為大根堆和小根堆,它們是完整的二叉樹。
2.資料結構和演算法,其實這屬於演算法的內容。 主要的內部排序方式有:氣泡排序、選擇排序、插入排序、快速排序、合併排序。
當然,還有很多更複雜的排序方法(二叉樹排序、堆排序。 很多)主要掌握前 4 個會很好。
3.合併排序是一種常用的排序方法,其主要思想是:依次劃分乙個無序的數字序列,直到每個序列只有乙個元素源銑,然後將兩個序列合併成乙個有序序列,依此類推。 鏟斗軌道。
-
遞迴公式。 由於設計到遞迴。 潛意識地想要使用遞迴有兩個必要條件。
如果我們想對陣列中的一組資料進行排序,下標從 startindex 到 endindex,我們選擇 startindex 和 endindex 之間的任何資料作為樞軸。 通常,選擇陣列的最後乙個元素。
我們從 startindex 到 endindex 遍歷資料,將較小的樞軸放在左邊,將較大的樞軸放在右邊,將樞軸放在中間。
完成這一步後,陣列的 startindex 和 endindex 之間的資料分為三部分,都小於樞軸,中間為樞軸,秒大於樞軸。
根據分而治之和遞迴的思想,我們可以對 startindex 和 pivot-1 之間的資料以及 pivot+1 和 endindex 之間的資料進行遞迴排序,直到區間縮小到 1,這意味著所有資料都是有序的。
有了核心思想,現在給出了遞迴公式。 和退出條件
t(n) =2*t(n/2) +n
推導邏輯和合併順序是一致的。 時間複雜度為:o(nlogn)
快速排序是一種就地排序,一種以交換形式實現的運動,無需開啟額外的記憶體空間,空間複雜度為:o(1)
合併和排序的過程是從下到上,首先處理子問題,然後合併它們。
快速行正好相反,它的處理過程是:從上到下,先分割槽,然後處理子問題。
合併排序不是就地排序,需要額外的記憶體空間。
快速排序是一種就地排序。
-
快速排序是一種適用於Pascal和C++等語言的電腦科學詞彙,是對氣泡排序演算法的改進。
1.首先,設定乙個分界值,通過分界值將陣列分為左右兩部分。
2.將大於或等於截止值的資料集中在陣列的右側,將小於截止值的資料集中在陣列的左側。 在這種情況下,左側部分中的所有元素都小於截止值,而右側部分中的所有元素都大於或等於截止值。
3.然後,可以對左右兩側的資料進行獨立排序。 對於左側的陣列資料,可以取乙個分界草圖賦值,將資料部分分為左右兩部分,將較小的值放在左側,較大的值放在右側。 右邊的陣列資料可以類似地處理。
4.重複上述過程,可以看出這是乙個遞迴定義。 遞迴排序左側部分後,遞迴排序右側部分。 當對左右部分的資料進行排序時,將對整個陣列進行排序。
排序演示
假設初始序列為:5、3、7、6、4、1、0、2、9、10、8。
此時ref=5,i=1,j=11,從後到前看,第乙個小於5的數字是x8=2,所以序列是:2,3,7,6,4,1,0,5,9,10,8。
此時,i=1,j=8,從前到後,第乙個大於5的數字是x3=7,所以順序是:2、3、5、6、4、1、0、7、9、10、8。
此時,i=3,j=8,從第8位數字往前看,小於5的第乙個數字是x7=0,因此:2,3,0,6,4,1,5,7,9,10,8。
在這種情況下,i=3,j=7,從第3位數字向後看,第乙個大於5的數字是x4=6,因此:2,3,0,5,4,1,6,7,9,10,8。
此時,i=4,j=7,從第7位往前看,小於5的第乙個數字是x6=1,因此:2,3,0,1,4,5,6,7,9,10,8。
此時,i=4,j=6,從第4位向後看,直到第6位有乙個大於5的數字,這時,i=j=6,ref變成一條分界線,前面的數字比它小,後面的數字比它大,對於數字的兩部分, 您可以使用相同的方法進行排序。
建立順序表如下:
通過陣列元素 a[0..n-1] 建立順序表 l。 a 中的每個元素都按順序放置在順序表中,n 被分配給順序表的長度字段。 演算法為: >>>More
1)無法接受它的描述方式。資料結構的描述多以抽象的形式出現,我們習慣於使用自然語言表示式,這使得很難接受資料結構的抽象表示式。 不止乙個學生問我,書中的“elemtype”到底是什麼型別? >>>More