每日一題 快速排序 20091016

2021-08-30 06:13:15 字數 1066 閱讀 6746

[b]問題描述[/b]:請實現快速排序,並討論pivot對複雜度的影響。

[b]問題分析[/b]:快速排序是目前使用頻率較高的排序(當然,有時候為了偷懶就可以冒泡一下),很多參考書上對pivot的選擇就是選擇第乙個元素,但如果是乙個高度排序的序列的話,時間複雜度就會接近o(n2),還不如直接用冒泡完成。所以選擇乙個合適pivot對整個演算法複雜度的影響至關重要。一般會在front,rear,center之間選擇乙個中間值當作pivot。詳盡分析請參見《data structure and algorithm analysis in c++ third edition》p206 7.2.2的分割策略的討論。

[b]問題解答[/b]:

以下程式基本按照mark allen weiss提供的方法實現的,但由於源程式使用了stl,並且將10個數以下的排序交給插入排序完成,所以我做了少許改動。

#include

void quicksort(int *a,int left,int right);

int median3(int *a,int left,int right);

void swap(int *a,int *b);

void swap3(int *a,int left,int right);

int main()

void quicksort(int *a,int left,int right)

while (a[--j] > pivot) {}

if (i < j)

swap(&a[i],&a[j]);

else

break;

}swap(&a[i],&a[right-1]);

quicksort(a,left,i-1);

quicksort(a,i+1,right);

} else

}void swap(int * a,int *b)

void swap3(int *a,int left,int right)

int median3(int *a,int left,int right)

每日一題 92 快速排序

題目來自網路 題目 1 基於陣列的快速排序 題目 2 基於鍊錶的快速排序 題目 1 基於陣列的快速排序 思路 使用分治的思想,先選擇樞軸,之後執行一次劃分,並把原序列劃分兩個子串行,之後遞迴處理。int partition int narr,int nstart,int nend narr nsta...

每日一題30 拓補排序

所謂拓補排序就是確定圖中節點的一種順序,使得某些在別的節點訪問之前不能訪問到的節點排在後面。所以該演算法的核心是每一步選擇乙個沒有入度的節點,因為沒有入度意味著該節點沒有前驅,得到乙個節點後,就把以新得到的節點為起點的邊去除,從剩下的節點重複前面的過程直到所有節點都排好序或找不到乙個不具有入度的節點...

每日一題 合併排序

title 每日一題 合併排序 date 2019 11 02 23 53 02 tags 73.合併排序 10分 c時間限制 3000 毫秒 c記憶體限制 3000 kb 題目內容 使用合併排序演算法,對輸入的n個資料進行按公升序排序。輸入描述 分兩行,第一行是整數n,第二行是n個整數,每個整數之...