堆排序 桶排序 歸併排序

2021-08-22 10:30:49 字數 2826 閱讀 3430

九種經典排序演算法詳解(氣泡排序,插入排序,選擇排序,快速排序,歸併排序,堆排序,計數排序,桶排序,基數排序)

#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儲存...