演算法 快速排序 quick sort

2021-06-27 01:35:47 字數 1681 閱讀 2180

在前面介紹的排序演算法中,最快的排序演算法為歸併排序,但是歸併排序有乙個缺陷就是排序過程中需要o(n)的額外空間。本文介紹的快速排序演算法時一種原地排序演算法,所需的額外空間複雜度為o(1)。

演算法介紹:快速排序其實一種根據需找某個元素的具體位置進行排序的方法。比如所存在如下陣列

選擇第乙個元素5,找到5最終的位置,即5的左邊的數都小於或者等於5,右邊的數都大於或者等於5.

從"6"開始,可知6大於5,此處停住,從「2」開始2小於5,因此交換6與2的位置,然後接著往下走,將所有小於等於5的都放在左邊,大於等於5的都放在右邊,等到如下所示的陣列:

此時的索引在4的位置,然後交換5和4的位置,這樣就保證了左邊的都小於5,右邊的都大於5。

然後再分別對5的左右兩邊重複上述過程即可將陣列按公升序排列。

演算法發複雜度分析:假設每次都從中間將陣列分開,且演算法的執行時間為t(n),則依據演算法的執行過程可知,找到當前元素的位置需要掃面一遍陣列即n次,然後再對此元素兩邊的子陣列重複上述操作。為此t(n)=2*t(n/2)+n,解得t(n)=o(nlogn)。

演算法實現:

尋找切分點

int sort::partition(int* a, const int low, const int high)

while(value < a[--j]);

//a[low] == value,因此可以知道j==low時,此判斷條件不成立,可知此時i必大於j,從而整個迴圈結束。

if(i>=j)

break;

swap(a,i,j);

} swap(a,low,j);

return j;

}

快速排序:

void sort::quick_sort(int* a, const int low, const int high)

上述即為快速排序的具體實現。但是對上述演算法還有很多的改進之處,比如說對存在大多數重複資料的陣列排序,初始切分點的選取等等都可以進行改進。具體的改進如下所示:

對於較小的子陣列使用插入排序:

void sort::insert_sort_update(int* a, const int n)

a[j] = temp; }}

void sort::quick_sort_update_with_insert_sort(int* a, const int low, const int high)

int loc = partition(a,low,high);

quick_sort_update_with_insert_sort(a,low,loc-1);

quick_sort_update_with_insert_sort(a,loc+1,high);

}

對於含有大多數重複元素的改進:

void sort::quick_sort_update_with_partition(int* a,const int low, const int high)

else

}quick_sort_update_with_partition(a,low,lt-1);

quick_sort_update_with_partition(a,gt+1,high);

}

上述博文主要介紹了快速排序演算法及其改進。歡迎拍磚

快速排序演算法QuickSort

quicksort.cpp 定義控制台應用程式的入口點。快速排序演算法實現 設要排序的陣列是a 0 a n 1 首先任意選取乙個資料 通常選用第乙個資料 作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。然後,對前面部分比它小的數繼續進行快速排序 ...

演算法 快速排序(Quick Sort)

演算法定義 目前學習是五種排序 冒泡 插入 選擇 合併 快速 中,快速排序是最讓我喜歡的演算法 因為我想不到 其定義如下 演算法舉例 5,4,3,2,1 5,4,3,2,1 4,5,3,2,1 1,5,3,2,4 1,4,3,2,5 1,2,3,4,5 演算法實現 1 using system 2u...

排序演算法 快速排序(QuickSort)

快速排序演算法又稱劃分交換排序 partition exchange sort 最早由東尼 霍爾 c.a.r.hoare 圖靈獎得主於1960年提出的。常見的排序演算法大概七八種,其中快速排序是使用很廣泛 速度也較快的一種演算法,其名 快速 就能看出它的特點。快速排序採用了 分治法 策略,把乙個序列...