您的位置:首页 > 其它

快速排序,选择排序,冒泡排序

2018-03-29 15:06 211 查看
一。快速排序从数列中选取一个数作为基数用于比较,记为cardinal
将大于cardinal的数全部放在右边,将小于cardinal的数全部放在左边,进行分区
再对左右两边的分区重复进行第二步,直到分区只有一个数
快速排序是基于分治策略的,分治策略常用的解决方法就是二分法,递归解决


上面用图走了一遍第一次快速排序,这种方法是左右交换的办法比较实用,还有挖坑填值法,可以自去看看,下面是java代码的实现public static void quickSort2(int[] num,int left,int right){
if(left<right){
int port = num[left];
int L = left+1;
int R = right;
while(L<=R){
/*从右边找比基数小的数*/
while(L<=R && num[R]>port)R--;
/*左边开始找 比基数大的值*/
while(L<=R && num[L]<=port)L++;
/*当找到两个符合条件的数,交换两个数*/
if(L<R){
int temp = num[L];
num[L] = num[R];
num[R] = temp;
/*越过这两个数,以为已经比较替换了*/
L++;
R--;
}
}
/*当找不到同时符合两个条件的数的时候,把此时右边的数和基数替换*/
int temp = num[R];
num[R] = port;
num[left] = temp;
/*递归排序左边和右边的*/
quickSort2(num,R+1,right);
quickSort2(num,left,R-1);
}
}二。冒泡排序

    冒泡排序:如果升序,左边第一个数和剩余的数比较一发现有比自己小的马上交换,依次执行
/**
* 冒泡排序
* 每一次找出剩下最大的放在后面
*时间复杂度为O(n^2)
*/
for(int i=num.length-1; i>=0; i--){
for(int j=i-1; j>=0 ; j-- ){
/*找到比自己大的马上交换*/
if(num[i]<num[j]){
int temp = num[i];
num[i] = num[j];

4000
num[j] = temp;
}
}
}
2.选择排序,相当于冒泡的修改一点,每次找出最大或者最小的数再交换。
for(int i=num.length-1; i>=0; i--){
int max = i;
for(int j=i-1; j>=0 ; j-- ){
/*发现有比自己大的数,记录小这个数的位置*/
if(num[max]<num[j]){
max = j;
}
}
/*一轮下来发现最大的数不是自己,就交换位置*/
if(i != max){
int temp = num[i];
num[i] = num[max];
num[max] = temp;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐