Code:Stardust

Good luck
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

快速排序quicksort的实现与分析

Posted on 2013-07-18 22:52  房坚  阅读(189)  评论(0)    收藏  举报

据说快速排序所消耗的时间只有bubble的4%左右。。。不过这个和数据本身有关,如果数据里面有大量重复的数,则快速排序的效率会降低,所以它不是一种稳定的排序方法

 如果需要排序的数组为A[N],则排序的基本步骤可以用文字叙述如下:

1. 选择一个基准值(key),这里选择最后一个值为基准值,当然其他的值也行

2. 设置两个迭代器i和j,在开始的时候i指向数组的第一个元素,j指向最后一个元素

3. 迭代器i开始后向遍历(i++),j开始前向遍历(j--),直到满足A[i]<key, A[j]>key,则交换A[i]的A[j]的值

4. 重复步骤3,直到 i=j 停止遍历

使用C++实现快速排序的代码如下:

 1 #include "stdafx.h"
 2 #include <iostream>
 3 using namespace std;
 4 
 5 void quicksort(int *ptr, size_t first, size_t last){
 6     int key = *(ptr+last); //基准值key定为最后一个值
 7     int temp = 0;    //用来做交换的中间变量    
 8     size_t i = first, j = last-1; //设定迭代器的初始值
 9     while(i <= j){                //循环判定
10         if(*(ptr+i) >= key){
11             if(*(ptr+j) <= key){
12                 temp = *(ptr+i);  //A[i]与A[j]值交换
13                 *(ptr+i) = *(ptr+j);
14                 *(ptr+j) = temp;
15                 i++;j--;
16             }else{
17                 j--;              //如果没有找到合适的j,则j向前迭代
18             }
19         }else{
20             i++;                  //如果没有找到合适的i,则i向后迭代
21         };
22     };
23     *(ptr+last) = *(ptr+i);
24     *(ptr+i) = key;               //最后的key与排序后的终止位置进行值交换
25     if(i-1 > first){ 
26         quicksort(ptr,first,i-1); //开始递归
27     };
28     if(last > i+1){
29         quicksort(ptr,i+1,last);
30     };
31 }
32 
33 int _tmain(int argc, _TCHAR* argv[])
34 {
35     int A[] = {4,56,12,33,24,7,9,51,44,25,25,25};  
36     size_t first = 0;
37     size_t last = sizeof(A)/sizeof(int);
38     quicksort(A,first,last-1); //注意last一定要-1之后再传递给函数
39     for(size_t index = 0;index < last-first;index++)cout<<A[index]<<" "; //输出结果
40     system("PAUSE");
41     return 0;
42 }
quicksort

排序之前的序列为:{4,56,12,33,24,7,9,51,44,25,25,25}

排序之后的序列为:{4,7,9,12,24,25,25,25,33,44,51,56}