【資料結構】快速排序
參考維基百科:
快速排序使用分治法(Divide and conquer)策略來把一個序列(list)分為兩個子序列(sub-lists)。
步驟為:
- 從數列中挑出一個元素,稱為 "基準"(pivot),
- 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。
- 遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,但是這個演算法總會退出,因為在每次的迭代(iteration)中,它至少會把一個元素擺到它最後的位置去。
參考部落格:
http://blog.csdn.net/21aspnet/article/details/1539677
下面給出程式碼實現:
#include <stdio.h>
void Swap(int *a,int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
// 對一個給定範圍的子序列選定一個樞紐元素,執行完函式之後返回分割元素所在的位置,
// 在分割元素之前的元素都小於樞紐元素,在它後面的元素都大於這個元素
int Partition(int array[], int low, int high)
{
// 採用子序列的第一個元素為樞紐元素
int pivot = array[low];
while (low < high)
{
// 從後往前在後半部分中尋找第一個小於樞紐元素的元素
while (low < high && array[high] >= pivot)
{
--high;
}
// 將這個比樞紐元素小的元素交換到前半部分
Swap(&array[low], &array[high]);
// 從前往後在前半部分中尋找第一個大於樞紐元素的元素
while (low < high && array[low] <= pivot)
{
++low;
}
// 將這個比樞紐元素大的元素交換到後半部分
Swap(&array[low], &array[high]);
}
// 返回樞紐元素所在的位置
return low;
}
// 快速排序
void QuickSort(int array[], int low, int high)
{
if (low < high)
{
int n = Partition(array, low, high);
QuickSort(array, low, n);
QuickSort(array, n + 1, high);
}
}
void Qsort(int array[],int n)
{
QuickSort(array,0, n-1);
}
int main()
{
int i;
int a[]={23,4,9,34,12,3,89,7,80};
Qsort(a,9);
for(i=0; i<9; i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
相關文章
- 資料結構與演算法——快速排序資料結構演算法排序
- 資料結構:快速排序程式碼(已優化)資料結構排序優化
- 資料結構與演算法之快速排序資料結構演算法排序
- 資料結構 快速排序 C Swift 極簡版本資料結構排序Swift
- 資料結構與排序資料結構排序
- 【資料結構】希爾排序!!!資料結構排序
- 【資料結構】希爾排序資料結構排序
- 【資料結構】堆排序資料結構排序
- python演算法與資料結構-快速排序(36)Python演算法資料結構排序
- 淺談演算法和資料結構(4):快速排序演算法資料結構排序
- 複習資料結構:排序演算法(五)——快速排序的各種版本資料結構排序演算法
- C語言版資料結構及演算法_快速排序C語言資料結構演算法排序
- 【資料結構】歸併排序!!!資料結構排序
- 【資料結構】選擇排序!!!資料結構排序
- 【資料結構】氣泡排序資料結構排序
- 【資料結構】選擇排序資料結構排序
- 【資料結構】歸併排序資料結構排序
- 資料結構和演算法(Golang實現)(25)排序演算法-快速排序資料結構演算法Golang排序
- 資料結構和演算法面試題系列—排序演算法之快速排序資料結構演算法面試題排序
- 資料結構(python) —— 【18排序: 桶排序】資料結構Python排序
- 資料結構之---C語言實現快速排序(多個版本)資料結構C語言排序
- C#資料結構與演算法5-C# 快速排序C#資料結構演算法排序
- 資料結構第10章 排序資料結構排序
- 資料結構32:選擇排序資料結構排序
- 資料結構之計數排序資料結構排序
- 資料結構 堆排序 c Swift資料結構排序Swift
- 複習資料結構:排序(一)——插入排序資料結構排序
- 複習資料結構:排序(三)——選擇排序資料結構排序
- 資料結構與演算法 排序演算法 快速排序【詳細步驟圖解】資料結構演算法排序圖解
- 【Java資料結構與演算法】第八章 快速排序、歸併排序和基數排序Java資料結構演算法排序
- 資料結構第九節(排序(上))資料結構排序
- 資料結構與演算法——排序資料結構演算法排序
- 資料結構 歸併排序 C++資料結構排序C++
- 看圖輕鬆理解資料結構與演算法系列(快速排序)資料結構演算法排序
- 【PHP資料結構】插入類排序:簡單插入、希爾排序PHP資料結構排序
- 資料結構--排序--插入排序--python語言描述資料結構排序Python
- 複習資料結構:排序演算法(六)——堆排序資料結構排序演算法
- 複習資料結構:排序演算法(七)——桶排序資料結構排序演算法