九種經典排序演算法詳解(氣泡排序,插入排序,選擇排序,快速排序,歸併排序,堆排序,計數排序,桶排序,基數排序)
#include#includeusing namespace std;
/* * (最大)堆的向下調整演算法
* * 注:陣列實現的堆中,第n個節點的左孩子的索引值是(2n+1),右孩子的索引是(2n+2)。
* 其中,n為陣列下標索引值,如陣列中第1個數對應的n為0。
* * 引數說明:
* a -- 待排序的陣列
* start -- 被下調節點的起始位置(一般為0,表示從第1個開始)
* end -- 截至範圍(一般為陣列中最後乙個元素的索引)
*/void maxheapdown(int* a, int start, int end)
}}/*
* 堆排序(從小到大)
* * 引數說明:
* a -- 待排序的陣列
* n -- 陣列的長度
*/void heapsortasc(int* a, int n)
}/*
* (最小)堆的向下調整演算法
* * 注:陣列實現的堆中,第n個節點的左孩子的索引值是(2n+1),右孩子的索引是(2n+2)。
* 其中,n為陣列下標索引值,如陣列中第1個數對應的n為0。
* * 引數說明:
* a -- 待排序的陣列
* start -- 被下調節點的起始位置(一般為0,表示從第1個開始)
* end -- 截至範圍(一般為陣列中最後乙個元素的索引)
*/void minheapdown(int* a, int start, int end)
}}/*
* 堆排序(從大到小)
* * 引數說明:
* a -- 待排序的陣列
* n -- 陣列的長度
*/void heapsortdesc(int* a, int n)
}int main()
; int ilen = (sizeof(a)) / (sizeof(a[0]));
cout << "before sort:";
for (i=0; i0)
a[j++] = i;
delete buckets;
}
/**
* 歸併排序
*/#include using namespace std;
/* * 將乙個陣列中的兩個相鄰有序區間合併成乙個
* * 引數說明:
* a -- 包含兩個有序區間的陣列
* start -- 第1個有序區間的起始位址。
* mid -- 第1個有序區間的結束位址。也是第2個有序區間的起始位址。
* end -- 第2個有序區間的結束位址。
*/void merge(int* a, int start, int mid, int end)
while(i <= mid)
tmp[k++] = a[i++];
while(j <= end)
tmp[k++] = a[j++];
// 將排序後的元素,全部都整合到陣列a中。
for (i = 0; i < k; i++)
a[start + i] = tmp[i];
delete tmp;}/*
* 歸併排序(從上往下)
* * 引數說明:
* a -- 待排序的陣列
* start -- 陣列的起始位址
* endi -- 陣列的結束位址
*/void mergesortup2down(int* a, int start, int end)
/* * 對陣列a做若干次合併:陣列a的總長度為len,將它分為若干個長度為gap的子陣列;
* 將"每2個相鄰的子陣列" 進行合併排序。
* * 引數說明:
* a -- 待排序的陣列
* len -- 陣列的長度
* gap -- 子陣列的長度
*/void mergegroups(int* a, int len, int gap)
// 若 i+gap-1 < len-1,則剩餘乙個子陣列沒有配對。
// 將該子陣列合併到已排序的陣列中。
if ( i+gap-1 < len-1)
}/** 歸併排序(從下往上)
* * 引數說明:
* a -- 待排序的陣列
* len -- 陣列的長度
*/void mergesortdown2up(int* a, int len)
int main()
; int ilen = (sizeof(a)) / (sizeof(a[0]));
cout << "before sort:";
for (i=0; icout << a[i] << " ";
cout << endl;
mergesortup2down(a, 0, ilen-1); // 歸併排序(從上往下)
//mergesortdown2up(a, ilen); // 歸併排序(從下往上)
cout << "after sort:";
for (i=0; icout << a[i] << " ";
cout << endl;
return 0;
}
堆排序,歸併排序
1.介紹 對簡單的選擇排序的一種改進,改進效果非常明顯,每次在選擇最小記錄的同時,並根據比較結果對其他記錄做出相應的調整,那麼排序效率就會提高很多。定義 將待排序的序列構造成乙個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將它移走 其實就是將其與堆陣列的末尾元素進行交換,此時末尾元素就是最大值 ...
快速排序 堆排序 歸併排序
快速排序 includeusing namespace std int a 8 int sz sizeof a sizeof int int partition int a,int p,int r int main const int sz sizeof a sizeof int 堆化 保持最大堆的...
希爾排序,堆排序,歸併排序
思想 1 在直接插入排序的思想上,如果先使陣列盡可能有序,則就可使時間複雜度趨近o n 因此,演算法也集中在使陣列有序。首先用分組的方法將陣列分組,這裡舉例假設陣列有11個數,我們可以分為3個為1組,再1個為1組。2 給定乙個陣列分組的寬度,則外層迴圈就可直接從i 0 width開始,並用tmp儲存...