快速排序

来源:互联网 发布:已连接,但无法访问网络 编辑:程序博客网 时间:2024/06/17 04:39
#include<iostream>using namespace std;void swap(int* a,int* b){int temp=*a;*a=*b;*b=temp;}void quickSort(int a[],int first,int last){if(first<last){int i=first+1,j=last;int temp=a[first];int current=first;bool change=true;while(change){change=false;for(;j>current;){if(a[j]<temp){swap(&a[j],&a[current]);current=j--;change=true;break;}j--;}for(;i<current;){if(a[i]>temp){swap(&a[i],&a[current]);current=i++;change=true;break;}i++;}}quickSort(a,first,current-1);quickSort(a,current+1,last);}}void main(){int a[]={3,6,4,6,2,9,5,3,6,8,0,2};int length=sizeof(a)/sizeof(int);quickSort(a,0,length-1);for(int i=0;i<length;i++){cout<<a[i]<<" ";}}

以上代码都是急性写的(包括以前算法),没优化过,感觉有点臃肿,目前只为简单实现。。肯定还有更简洁的代码,大家自己看着优化下。

我的思路:先设置一个变量:change,它记录了本次遍历是否产生了交换,如果没有,那么就结束了这轮的排序。

还有大家看那个j--估计会有点奇怪,为什么不在for的后面直接加上呢,而且还在if的判断中写了j--呢,那是因为break的原因,如果懂for的执行顺序的话,就懂这个原理了,如果我们在if中执行了break,那么j--就不会执行了,但是我们要求每次执行了依次for循环就要求j--,所以我就在两处都写了j--当然还有一种方法,那就是把j--放在for循环的第一行,在下面的语句中如果用到了j,就把它变成j-1就可以了。。对i也是这个解释。。

其实这里用while循环来做,会简单点。。留给大家自己做吧。。

原创粉丝点击