算法描述
快速排序采用一种“分而治之、各个击破”的观念。
快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
步骤为:
1. 从数列中挑出一个元素,称为 "基准"(pivot),
2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
1 // 2 // s_quicksort.cpp 3 // 4 // Created by scandy_yuan on 12-12-27. 5 // Copyright (c) 2012年 Sam. All rights reserved. 6 // 7 8 9 10 #include <iostream> 11 using namespace std; 12 13 //快速排序算法实现函数 14 void s_quicksort(int data[],int left,int right) 15 { 16 if(left>=right) return ; 17 //int l,r 用来记录左右下标 18 int l,r,key; 19 l = left; 20 r = right; 21 //key做为初始值(基准) 22 key = data[l]; 23 //左右下标没有重合的情况下循环比较 24 while(l < r){ 25 while(l < r && data[r] > key) r--; 26 if(l < r) data[l++] = data[r]; 27 while(l < r && data[l] < key) l++; 28 if (l < r) data[r--] = data[l]; 29 } 30 data[l] = key; 31 //开始递归排序左右两边的未排序的数 32 if(left < l - 1) 33 s_quicksort(data, left, l-1); 34 if(l+1 < right) 35 s_quicksort(data, l+1, right); 36 } 37 38 int main(int argc, const char * argv[]) 39 40 { 41 // insert code here... 42 //测试 43 int arr[5] = {2,1,5,4,3}; 44 s_quicksort(arr, 0, 5); 45 for(int i=0;i<5;i++){ 46 cout << arr[i] << endl; 47 } 48 return 0; 49 }