常用排序演算法總結

2021-07-03 14:06:37 字數 2908 閱讀 2248

注:所有排序都是寫的由小到大排序的情況

1.插入排序

1)直接插入排序(穩定)

arr[sortedindex+1]=key; //注意這裡的下標 sortedindex+1

}}

2)希爾排序 (不穩定)

希爾排序好的增量序列的共同特徵:

希爾排序演算法&fromid=1801475&type=syn

① 最後乙個增量必須為1

② 應該盡量避免序列中的值(尤其是相鄰的值)互為倍數的情況

**:

void shellsort(int* arr, int len)

arr[sortedindex+gap] = key;}}

2.選擇排序1)直接選擇排序(不穩定)第一次從r[0]~r[n-1]中選取最小值,與r[0]交換,第二次從r[1]~r[n-1]中選取最小值,與r[1]交換,....,第i次從r[i-1]~r[n-1]中選取最小值,與r[i-1]交換,.....,第n-1次從r[n-2]~r[n-1]中選取最小值,與r[n-2]交換,總共通過n-1次,得到乙個按排序碼從小到大排列的有序序列·

初始狀態 [ 8 3 2 1 7 4 6 5 ] 8 1

第一次 [ 1 3 2 8 7 4 6 5 ] 3 2

第二次 [ 1 2 3 8 7 4 6 5 ] 3 3

第三次 [ 1 2 3 8 7 4 6 5 ] 8 4

第四次 [ 1 2 3 4 7 8 6 5 ] 7 5

第五次 [ 1 2 3 4 5 8 6 7 ] 8 6

第六次 [ 1 2 3 4 5 6 8 7 ] 8 7

第七次 [ 1 2 3 4 5 6 7 8 ] 排序完成

**:

void directchoosesort(int* arr, int len)

if(minindex!=keyindex)

}}

2)堆排序(不穩定)---最大堆最大堆性質:樹中每個結點的值都大於或者等於任意乙個子結點的值

給出了非遞迴和遞迴方法

//遞迴方法

void maxheapify_recursively(int* arr, int idx, int len)

void maxheapsort(int*arr, int len)

}

3.交換排序1)氣泡排序(穩定)**:

void bubblesort(int *arr, int len)

int partition(int *arr, int start, int end) }}

4.歸併排序(穩定)

**:

void merge(int* arr, int start, int end, int leftend)

while(leftbegin<=leftend)

pordered[index++]=arr[leftbegin++];

while(rightbegin<=end)

pordered[index++]=arr[rightbegin++];

for(int i=0;i=len)

return;

if(start

1)計數排序(穩定)

陣列中每個數都在[0,k]之間

(以十進位制為例,設每一位的排序基於計數排序的思想)

int maxbits(int* arr, int len,int base) //輔助函式,求資料的最大位數

}return nmaxbits;

}void radixsort(int* arr, int len) //基數排序

常用排序演算法總結

總結些常見的排序演算法,方便以後可以重用。資料量不大,為了表達方便就直接使用了陣列。int data null data new int 1.氣泡排序 氣泡排序,從小到大排序 for int i 0 i data.length i 氣泡排序就是說,排序的過程像水裡往上冒的氣泡一樣,每個數字代表乙個氣...

常用排序演算法總結

常用排序演算法總結 選擇排序 對於長度為n的陣列,選擇排序需要大約n2 2詞比較和n次交換。插入排序 對於隨機排列的長度為n且主鍵不重複的陣列 1 平均情況下,需要 n2 4次比較以及 n2 4次交換。2 最壞情況下,需要 n2 2次比較以及 n2 2次交換 3 最好情況下,需要n 1次比較以及0次...

常用排序演算法總結

includeusing namespace std show array void show int ar,int len selectsort 直接選擇排序不穩定 最好最壞平均時間複雜度都是o n 2 空間複雜度o 1 void selectsort int ar,int len else ar...