常見的七種排序

2021-09-09 09:22:31 字數 2934 閱讀 6313

排序演算法大體可分為兩類

非線性時間比較類排序:交換類排序(快速排序和氣泡排序)、插入類排序(簡單插入排序和希爾排序)、選擇類排序(簡單選擇排序和堆排序)、歸併排序(二路歸併排序和多路歸併排序);

線性時間非比較類排序:計數排序,桶排序,和基數排序

氣泡排序:重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序錯誤就把他們交換過來。簡單來說就是不停的比較,交換直到沒有任何乙個數字需要比較

void my_sort(int *arr, int len)}}

}

快速排序:

快速排序的思想是以第乙個數為基準,將整個陣列比基準大的放後面,比基準小的放前面,完成一趟排序,然後左半邊為乙個新的陣列,右半邊為乙個新的陣列依次在進行一次排序,直到資料有序

//劃分

int divide(int *arr, int left, int right)//找到left在陣列中的位置

arr[left] = tmp;

return left;

}//遞迴

void my_sort(int *arr, int left, int right)

}}

快速排序平均時間複雜度為o(nlogn)因為快速排序越有序越慢,當完全有序時會退化為選擇排序,所以快速排序的優化手段就是打亂開始排序時基準值

優化方法:隨機數法:在陣列中隨機拿到乙個數和第乙個數進行交換,然後在進行排序

三數取中法:取arr[left],arr[right],arr[(right-left)/2+left],中三個數的中間值, 以中間值為基準進行排序

直接插入排序:直接插入排序可以想象成打撲克牌,當你拿到一張牌時不動,拿到第二張時會和第一張進行比較,把它插入合理的位置,拿到第三張牌時會和手中已經有序的牌進行比較,再次插入乙個合理的位置。以此類推

void my_sort(int *arr, int len)

arr[j+1] = min;//將資料插入

}}

希爾排序:希爾排序實際是把一組資料以每隔n個元素劃分為一組,每組使用插入排序(因為插入排序越有序越快,當完全有序時為o(n))之後再每隔n-1個元素再次劃分為一組,每組使用插入排序,直到n等於0

和直接插入排序**相似,

void inter(int *arr, int len,int d)

arr[j + d] = min; }}

void my_sort(int *arr, int len, int d)

}

選擇排序:選擇排序選取陣列中最小(最大)的乙個數,放在第一位,然後在剩餘數中再次選擇乙個最小(最大)的數放入第二位,依次類推

void my_sort(int *arr, int len)

} int tmp = arr[min];

arr[i] = arr[min];

arr[i] = tmp;

}}

堆排序:在堆排序中可以把陣列看成一顆二叉樹,然後根據規則對這種二叉樹進行調整,大根堆跟節點大於左右兩個節點(左右兩個節點大小沒有限制)

小根堆根節點小於左右兩個節點

大根堆:

堆排序就是每次調整完畢後將第乙個和最後乙個交換:然後在對紅色框內的堆再次進行調整,調整完成後再次進行交換,之後再調整,依次類推直到只剩下乙個資料。調整堆要從下往上調整

void adjust(int *arr, int len)//調整堆

else

break;

}else//存在右孩子

else//當tmp_val值大於左右兩個孩子時停止下探

break;

}else

else

break;}}

} arr[tmp] = tmp_val;當一次下探完成後把tmp_val放入合適的位置

} //交換第乙個和len-1個元素的位置

int is_tmp_val = arr[0];

arr[0] = arr[len - 1];

arr[len - 1] = is_tmp_val;

}void my_sort(int *arr,int len)

}

歸併排序:歸併排序分為二路歸併和多路歸併,本質是不停的劃分資料,直到劃分為乙個時停止劃分,開始合併

二路歸併:

遞迴歸併

void merge(int *arr,int left,int right,int mid,int *brr)

while (i<=mid)//將左邊剩餘的資料加入陣列

while (j<=right)//將右邊剩餘的資料加入陣列

for (left; left <=right; left++)//將臨時陣列中排好序的資料加入原陣列

}void my_sort(int *arr, int left, int right, int *brr)

while (left1<=right1)

while (left2<=right2)

left1 = right2 + 1;

right1 = left1 + num - 1;

left2 = right1 + 1;

right2 = left2 + num - 1 < len ? left2 + num - 1 : len - 1;

} for (int x = 0; x < len; x++) }

for (int i = 1; i

開始,每次擴大2倍

七種排序方法

一 快速排序 1.簡單介紹 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的...

七種排序方法

一 快速排序 1.簡單介紹 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的...

七種基本排序

排序 所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排 列起來的操作。穩定性 假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這 些記錄的相對次 序保持不變,即在原序列中,r i r j 且r i 在r j 之前,而在排序後的序列中,r i 仍在r j...