經典演算法 八大排序演算法總結

2021-07-22 18:19:58 字數 4107 閱讀 7102

插入排序

特點:stable sort、in-place sort,最好o(n),最壞o(n^2)

氣泡排序

特點:stable sort、in-place sort

思想:通過兩兩交換,像水中的泡泡一樣,小的先冒出來,大的後冒出來。

快速排序

改進當所有元素相同時的效率的partition實現:

堆排序

計數排序

基數排序

// 插入排序

void insert_sort(vector

& v, int l, int r)

v[j+1] = key;}}

}// 氣泡排序

void bubble_sort(vector

& v, int l, int r)

}}

}

}// 選擇排序

void select_sort(vector

& v, int l, int r)

}while(iwhile(jdelete a;

delete b;

}}void merge_sort(vector

& v, int l, int r)

}// 快排

int partition(vector

& v, int l, int r)

void quick_sort(vector

& v, int l, int r)

}// 堆排序

int parent(int i)

int leftchild(int i)

int rightchild(int i)

void maxheapify(vector

& v, int len, int i)

else

if(rchildv[maxpos])

if(maxpos != i)

}void buildheap(vector

& v, int len)

}void heap_sort(vector

& v, int len)

}// 計數排序

void count_sort(vector

& v, int len, int k)

for(int i=0; i// 基數排序

/* * get the spcific digit of given number.

* for example, number 234,

* the 0st digit is 4,

* the 1st digit is 3,

* the 2nd digit is 2,

* the 3th digit is 0.

*/int ge***igit(int nnumber, int nidx)

return nnumber % 10;}/*

* counting sort the given array according to specific digit.

* array: 待排序陣列.

* nlength: 待排序陣列長度

* nidxdigit: 排序要依據的位. 0為最低位,高位依次加1.

* nk: *nidxdigit位上可能出現的最大數字(對10進製數排序則nk=9).

*/void countingsort_specificdigit(vector

& array, size_t nlength, int nidxdigit, int nk=9)

// 把排序結果寫回原陣列

for(int i=0; iarray[i] = arrayresult[i];

delete digitnum;

delete count;

delete arrayresult;}/*

* 基數排序

* array: 待排序陣列

* nlength: 待排序陣列元素個數

* ndigit: 所有元素的最大位數

*/void radix_sort(vector

& array, size_t nlen, int ndigit)

}void printvec(vector

& v)

}int main()

cout

printvec(v);

insert_sort(v,0,v.size()-1);

cout

printvec(v);

for (int i = 0; i < 10; i++)

cout

printvec(v);

bubble_sort(v,0,v.size()-1);

cout

printvec(v);

for (int i = 0; i < 10; i++)

cout

printvec(v);

select_sort(v,0,v.size()-1);

cout

printvec(v);

for (int i = 0; i < 10; i++)

cout

printvec(v);

merge_sort(v,0,v.size()-1);

cout

printvec(v);

for (int i = 0; i < 10; i++)

cout

printvec(v);

quick_sort(v,0,v.size()-1);

cout

printvec(v);

for (int i = 0; i < 10; i++)

cout

printvec(v);

heap_sort(v,10);

cout

printvec(v);

for (int i = 0; i < 10; i++)

cout

printvec(v);

count_sort(v,10,5);

cout

printvec(v);

v.resize(20);

for (int i = 0; i < 10; i++)

cout

printvec(v);

radix_sort(v,20,1);

cout

printvec(v);

system("pause");

return

0;}

八大排序演算法總結

1.直接插入排序 原理 將陣列分為無序區和有序區兩個區,然後不斷將無序區的第乙個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區 完成排序。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。實現 void insertsort node l,int length l i 1 l 0 ...

八大排序演算法總結

插入排序 1.直接插入排序 原理 將陣列分為無序區和有序區兩個區,然後不斷將無序區的第乙個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區完成排序。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。實現 void insertsort node l,int length int i,...

八大排序演算法總結

插入排序 1.直接插入排序 原理 將陣列分為無序區和有序區兩個區,然後不斷將無序區的第乙個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區完成排序。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。實現 void insertsort node l,int length int i,...