資料結構中的排序演算法

2021-08-15 14:24:59 字數 2685 閱讀 1667

—–參考自《大話資料結構》

氣泡排序的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序則交換。

//注釋:n是陣列的長度,[0,i-1]之間已經排好序,第乙個for迴圈是對當前的第i位排序,

//第二個for迴圈對[i,n-1]之間的相鄰的數進行排序,相鄰的逐一進行比較,使得小的逐漸向上交換

void bubblesort(int arr,int n)}}

}

改進的冒泡演算法:

存在的問題是:若進行前幾次的冒泡後,資料已經有序了,但是上面的方法仍然會對i進行後面的迴圈,同時也要對第二個for迴圈進行迴圈,可以設定狀態量,當第二個for迴圈裡面沒有發生交換時,說明陣列已經有序,不必再接著進行迴圈。

void bubblesort(int arr,int n)}}

}

氣泡排序複雜度分析:

當待排序陣列是逆序時,需要的比較的次數是乙個累加和:(n-1)+(n-2)+…+1 = n(n-1)/2,時間複雜度為o(n的平方)。

通過n-i次關鍵字間的比較,從n-i+1個記錄中選出關鍵字最小的記錄,並和第i個記錄交換。

void selectionsort(int arr, int n)

}

複雜度分析:

無論原始排序的好壞,最終的比較次數都是一樣多,第i個for迴圈,需要進行n-i次關鍵關鍵字的比較,此時需要比較的次數是:(n-1)+(n-2)+…+1 = n(n-1)/2。而對於交換次數,最好時交換0次,最差時,需要(n-1)次.。

直接插入排序時間乙個記錄插入到已經排好序的有序表中,從而得到乙個新的、記錄數增加1 的有序表。

void insertionsort(int arr, int n)

return;

}

void insertionsort(int arr, int n)

return;

}

複雜度分析:根據記錄的隨機性,移動和交換的次數都是o(n^2)級別。

上面提到的直接插入排序在一下兩種情況下特別有用:1、序列基本有序;2、記錄數特別少。

將相距某個「增量」的記錄組成乙個子串行,在這個子串行上進行直接插入排序,這個「增量」逐漸 遞減,縮減到1,此時序列可以達到基本有序了。

void shellsort(int arr, int n)

h /= 3;}}

希爾排序最後一步(h=1)就是乙個直接插入排序,選擇一種的遞增序列(第乙個值為1),可以使得時間負責度為o(n^3/2),因為是跳躍式移動,所以不是穩定的排序。

堆是具有下列性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點值,稱為大頂堆;或者每個結點的值都小於或等於其左右孩子的值,稱為小頂堆。

堆排序主要的操作有兩部分:初始構建堆和重建堆的反覆篩選:

初始構建堆:

void heapadjust(int a,int i,int n)   

a[i] = a[j];

i = j;

}a[i]=temp;

}void heapsort(int a,int n)

for(i = n-1;i>0;i--)

}

堆排序的複雜度是o(nlogn),對原始資料的排序狀態並不敏感,最好,最壞和平均都是o(nlogn),空間上只需要乙個交換的暫存單元。記錄是跳躍式進行,非穩定排序演算法。

歸併的思想是:從這張圖可以看出,是先將大的序列進行兩兩分割,再分割到只有每份只有1或是2時,就將兩份進行兩兩合併。

void merge(int sr,int tr,int i ,int m ,int n)

if(i<=m)

}if(j<=n)

}}void msort(int sr,int tr1,int s,int t)

}

歸併排序最好、最壞和平均的時間效能的時間複雜度是o(nlogn),歸併排序需要與原始記錄同等數量的儲存空間存放歸併結果及遞迴深度為log2n的棧空間(堆排只是在原來的基礎上進行排序,額外空間只需要1),因此空間複雜度是o(n+logn),歸併排序是兩兩比較,穩定的排序演算法。

非遞迴實現:

2.7快速排序:

void quicksort(int a,int low,int high)

//從左向右搜尋,直到搜尋到的數小於等於開始記錄的數,交換其位置

while(ia[i] <= key)

i++;

if(ia[j] = a[i];

} a[i] = key;

quicksort(a,low,i-1);

quicksort(a,i+1,high);

}

堆排:

void headadjust(int data[ ] ,int length,int k){

int tmp = data[k];

int i = 2*k+1;

while(i

資料結構中的排序演算法

排序分為記憶體排序和外部排序,內部排序在記憶體中進行,外部排序因資料量較大,在外存中進行。一般我們常說的八大排序為內部排序。複雜度為o nlog2n 的排序演算法 快速排序 堆排序和歸併排序。1.1 演算法思想 每趟將乙個待排序的元素作為關鍵字,按照其關鍵字值的大小插入到已經排好的部分序列的適當位置...

資料結構中的排序演算法總結

資料結構中的排序演算法 當待排序序列基本有序時優先選擇簡單排序,快速排序平均次數少於堆排序 1 插入排序 1 直接插入排序 第一次將位置0和位置1進行比較,小的放前。第二次將位置2上的數字,插入到位置0和位置1中。第k次將位置k上的數字,插入到第k 1次已經完成的序列中。52 6 0 3 9 1 7...

資料結構 排序演算法

include include define maxitem 100 typedef char keytype 5 typedef int elemtype typedef struct rec elemnode maxitem 氣泡排序演算法 void bubblesort elemnode r,...