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 ...