經典排序演算法C 實現

2022-09-09 22:18:37 字數 2697 閱讀 4181

void insert(vector& a) 

}}//直接插入排序

void insert(vector& a)

}}//氣泡排序

void pick(vector& a)

swap(a[i], a[idx]);

}}//直接選擇排序

void merge(vector& ans, int l, int mid,int r) 

while (i <= mid)tmp.push_back(ans[i++]);

while (j <= r)tmp.push_back(ans[j++]);

for (int i = l; i <= r;i++)

}void mysort(vector&ans,int l,int r)

優化一:對小規模子陣列使用插入排序

用不同的方法處理小規模問題能改進大多數遞迴演算法的效能,因為遞迴會使小規模問題中方法呼叫太過頻繁,所以改進對它們的處理方法

就能改進整個演算法。因為插入排序非常簡單,因此一般來說在小陣列上比歸併排序更快。這種優化能使歸併排序的執行時間縮短10%到15%。

怎麼切換呢?只要把作為停止遞迴條件的

if(l>=r) return;

改成 if(l>=r+10)

就可以了,這樣的話,這條語句就具有了兩個功能:

1. 在適當時候終止遞迴

2. 當陣列長度小於m的時候(high-low <= m), 不進行歸併排序,而進行插排

//快速排序(從小到大)荷蘭國旗問題

void mysort(vector&ans,int l,int r)

swap(ans[left], ans[l]);//有講究以後這句調換以後才保證左邊都小於基準,右邊都大於基準

mysort(ans, left, l - 1);

mysort(ans, l+1, right);

}

#include using namespace std;

void adjust_heap(int* a, int node, int len)

}void heap_sort(int* a, int len)

}int main()

; int len = sizeof(a) / sizeof(int);

for (int i = 0; i < len; ++i)cout << a[i] << ' ';

cout << endl;

heap_sort(a, len);

for (int i = 0; i < len; ++i)cout << a[i] << ' ';

cout << endl;

return 0;

}

void insert(vector& ans,int step,int idx) 

}}//指定步長的直接插入排序

void mysort(vector&ans)

step /= 2;

}

}//初始步長一般取陣列長度/2,此後每次減半,一直到一

在最好情況下(基本有序),高效的演算法是:

直接插入排序、氣泡排序。

在無序情況下,高效的演算法是:

堆排序、快速排序、歸併排序。

與初始序列無關的排序演算法:簡單選擇排序。

如果給你乙個陣列,長度很長,綜合排序會先進行乙個判斷,判斷陣列裡面放的資料型別是什麼樣的,是基礎型別(int,double,char,float,short)還是你自定義的型別(student)。

如果裝的是基礎型別的資料,則會用快排(不穩定);

原因是:基礎型別根本不用區分原始順序,相同值無差異。

如果資料的型別是你自己定義的(student)型別,則會用歸併排序(穩定)。

原因是:對乙個班級,先按照整個分數排序,再按照班級排序,此時相同班級的個體可能是不一樣的,是有差別的。

如果你的陣列長度很短,不管存放的是什麼型別的資料,綜合排序根本不會選擇快排或者歸併排序,它會直接用插入排序。

原因是:插入排序的常數項極低,在樣本模數小於60的情況下直接用插入排序,為啥?

因為,雖然插入排序是o(n2)的排序,但是當樣本量在極小的情況下,o(n2)的劣勢表現不出來,反而插入排序的常數項很低,導致在小樣本的情況下插入排序會飛快!

經典排序演算法C 實現

用c 實現了經典的氣泡排序 插入排序 選擇排序 堆排序 快速排序 希爾排序 歸併排序。等空閒的時候再補充每個排序演算法的思想以及易錯點。氣泡排序 void bubble sort vector arr,int n if swaped 0 break else swaped 0 插入排序 withou...

經典排序演算法(C 實現)

氣泡排序 public static int bubblesort int array return array 選擇排序 1.從左至右遍歷,找到最小 大 的元素,然後與第乙個元素交換。2.從剩餘未排序元素中繼續尋找最小 大 元素,然後與第二個元素進行交換。3.以此類推,直到所有元素均排序完畢。pu...

C 實現所有經典排序演算法

c 實現所有經典排序演算法 1 選擇排序 希爾排序 public class shellsorter arr j 1 t static void main string args shellsorter s new shellsorter s.sort array foreach int m in ...