希爾排序:
void shellsort(int array, int len)// o(n*n)//希爾排序關鍵思想先分組,再分別插入排序
array[k] = temp;
}}while( gap > 1 );//迴圈條件,當gap=1時,恢復至插入排序
}//選gap的方式現在仍然是計算機界乙個大問題,目前的選擇都是根據大量工程實踐而來
快速排序:
int partition(int array, int low, int high)//一次劃分函式
swap(array, low, high);//當high小於基準時,交換位置
while( (low < high) && (array[low] <= pv) )
swap(array, low, high);//當low大於基準時,交換位置
}return low;//基準量
}void qsort(int array, int low, int high)//快速遞迴劃分
}void quicksort(int array, int len) // o(n*logn)//快速排序
歸併排序:
將兩個或兩個以上的有序序列合併成乙個新的有序序列:
有序序列v[1] …v[m]和v[m+1] …v[n] v[1] …v[n]
這種歸併方法稱為2路歸併。
將3個有序序列歸併為乙個新的有序 序列,稱為 3路歸併 。
將多個有序序列歸併為乙個新的有序序列, 稱為 稱為多路歸併。
void merge(int src, int des, int low, int mid, int high)//二路歸併函式,source,destination
else
}while( i <= mid )
while( j <= high )
}void msort(int src, int des, int low, int high, int max)//將src裡面的元素排序好之後,再將des中的值複製到src中
else
free(space);//釋放輔助空間}}
void mergesort(int array, int len) // o(n*logn)
希爾排序, 快速排序和歸併排序將排序演算法的時間複雜度提高到了o(n * log n) ;
希爾排序和快速排序的排序結果是不穩定的,歸併排序的排序結果是穩定的;
歸併排序需要利用輔助空間,可直接做外排序!!
高階排序演算法 希爾排序
希爾排序 希爾排序是插入排序的優化版。回憶一下插入排序,假如插入排序執行到一半的時候,這時陣列左邊是已經排好序的,而右邊是還沒有排序的。如果有乙個很小的資料項恰好在右邊的位置,這時所有左邊已排好序的陣列都得往右移,騰出空位讓這個小的資料項插入。希爾排序是在插入演算法的基礎上再次降低交換的次數,以此獲...
排序演算法(nlogn級)
歸併排序 merge 函式是合併兩個有序序列,使用了two pointers的思想,可以看看演算法筆記上的記錄 將陣列a的 l1,r1 與 l2,r2 區間合併成有序區間 此處l2即為 r1 1 const int max 100 void merge t a,int l1,int r1,int l...
高階硬菜 排序演算法高階
下面這一章所講解到演算法將是最精彩和有趣的,涉及到的演算法思路將會在你以後的 中經常使用 講解到的演算法有歸併排序 快速排序 堆排 桶排序。歸併排序 merge sort 是利用歸併的思想實現的排序方法,該演算法採用經典的分治策略 divide and conquer 分治法將問題分 divide ...