据说快速排序所消耗的时间只有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 }
排序之前的序列为:{4,56,12,33,24,7,9,51,44,25,25,25}
排序之后的序列为:{4,7,9,12,24,25,25,25,33,44,51,56}
浙公网安备 33010602011771号