希爾排序(by donald shell):
//利用了插入排序的簡單 ,同時克服 插入排序以此交換消去乙個 逆序對的困難.
既然我們 決定 要 做上述之事 那麼我們 最迫切的事情就是 確定我們以此交換 間隔幾個位置?
假定給了乙個需要排序的陣列並且 按照5-間隔的方式進行排序 附圖如下
我們 慢慢的按照 越來越小的間隔開始去排序 (最後只能是間隔為1).
阿呆說 增量元素不互質 ,則最小增量可能根本不起作用 .會導致 很糟糕的時間複雜度,所以 會造成 n^2的時間複雜度 .(和插入排序一樣.) (講插入排序的作用 目前就是 給希爾排序做鋪墊.)
所以為了解決上述問題我們就引入乙個hibbard增量序列 dk=2^k-1 相鄰元素互質 最壞情況t=(n ^3/2)
堆排序:
先回顧一下插入排序
void selection_sort ( elementtype a, int雷迪森 按的 箭頭們 有沒有想到 堆排序?如果這樣做的話 我們就開啟了乙個堆排序....n )}
void heap_sort(element a,int下面 開始避免上面出現的問題.n)
for(i=0;i)
} //
整體時間複雜度有 nlogn
我們可以將上述的最小堆調整成最大堆. (附上乙個堆排序的題目,和堆排序做出來的答案)
//由於建初始堆所需的比較次數較多,所以堆排序不適宜於記錄數較少的檔案。1void heap_sort(elementtype a,intn)2
10}11//
定理:堆排序處理n個不同元素的隨機排列的平均次數是 2n log n - n log log n
12//
雖然堆排序給出最佳平均時間複雜度
,但實際效果不如用sedgewick增量序列的希爾排序.
下面附上乙個
第一步 這是將已經有序的 兩個序列歸併在一起.
/*第二步下面是分而治之l = 左邊起始位置, r = 右邊起始位置, rightend = 置 右邊終點位置
*/void merge( elementtype a, elementtype tmpa,int l, int r, int
rightend )
while( l <= leftend ) /*
的 直接複製左邊剩下的
*/tmpa[tmp++] = a[l++];
while( r <= rightend ) /*
的 直接複製右邊剩下的
*/tmpa[tmp++] = a[r++];
for( i = 0; i < numelements; i++, rightend --)
a[rightend] =tmpa[rightend];
}
這是 分而治之 講乙個很長的待排序列 劃分為很小 遞迴的去解決
void msort(elementtype a,elementtype tmpa,int l,int第三步 統一函式介面rightend)
}
void merge_sort(elementtype a,int----------話說遞迴都不是太好用---下面附上非遞迴演算法----這才是重要的.-- 下面附上 非遞迴演算法的思想n)
else
error (
"空間不足\n");
}
臨時陣列需要用多少容量(假設 待排序陣列的容量為 n )----------答案有一種很大 就不說了
另一種就是開乙個和 原先陣列一樣大的 , 陣列去 解決問題.
void merge_sort(elementtype a,int歸併排序 在 外排序時用的比較多 內排序時 沒什麼人用 .n) free(tmpa);
}else
error (
"空間不足.\n");
}
希爾排序,堆排序,歸併排序
思想 1 在直接插入排序的思想上,如果先使陣列盡可能有序,則就可使時間複雜度趨近o n 因此,演算法也集中在使陣列有序。首先用分組的方法將陣列分組,這裡舉例假設陣列有11個數,我們可以分為3個為1組,再1個為1組。2 給定乙個陣列分組的寬度,則外層迴圈就可直接從i 0 width開始,並用tmp儲存...
幾種排序,希爾排序,快速排序,堆排序,歸併排序
因為最近看了一點stl,所以用vector代替了陣列,從別的地方借鑑了很多,只是簡單的實現,也沒有做什麼優化,其實也不會 include include includeusing namespace std void print vectorv swap v left v high quick so...
氣泡排序,插入排序,堆排序,歸併排序,希爾排序
感謝姥姥提供模板 感謝姥姥 展示 include include using namespace std 氣泡排序 void bubble sort int arr,int n 插入排序 void insertionsort int arr,int n arr i tmp 希爾排序 void she...