Sam大叔
"if you ever want something badly,let it go.if it comes back to you,then it's yours forever.if it doesn't,then it was never yours to begin with."

导航

 

算法描述

快速排序采用一种“分而治之、各个击破”的观念。

快速排序使用分治法(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 }

 

posted on 2012-12-28 13:50  Sam大叔  阅读(331)  评论(0)    收藏  举报