在前面介紹的排序演算法中,最快的排序演算法為歸併排序,但是歸併排序有乙個缺陷就是排序過程中需要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年提出的。常見的排序演算法大概七八種,其中快速排序是使用很廣泛 速度也較快的一種演算法,其名 快速 就能看出它的特點。快速排序採用了 分治法 策略,把乙個序列...