您的位置:首页 > 编程语言 > Java开发

Java快速排序

2016-02-29 11:23 148 查看
快速排序是一种很高效的排序算法,他通过设置选定数列一个成员作为中轴(通常就是第一个),然后将所有成员分为“大于中轴”和“小于中轴”两部分,然后分别在这两部分中再选一个中轴进行上一步的操作,以此类推,直到排序完成。在为每次分类出的 大、小 两部分选取新的中轴时,配合线程进行将成倍的提高速度,不过要注意线程的复用。

接下来解析一下快速排序的实现过程,有数组如下:

args[]={ 5、2、8、3、7、4、10、9、1、6 }

因为不想画图,我就先形容一下他的排序过程,然后在讲代码,以免太抽象

排序实现方式:

首先选出一个中轴,直接选择第一个 5

1、我们从数组最右边开始一个一个往前看,一旦找到一个比“5”小的,就停下,把这个数换到5的位置,第一次找到的当然是倒数第二个“1”,这一步完成后就是中轴5不在了,一个比“5”小的数“1”到了这个位置,而原来位置(下标[8])上的“1”变成了多余的数字

2、换个方向,在从左边开始一个一个往后找,这次找大的,一旦找到比“5”大的,就停下,把这个数放到刚刚多余出来的“1”的位置,这次找到的是8,这一步完成后,刚刚多余出的“1”被换成了“8”,那么现在“下标[2]”位置的“8”又变成了多余的数字

3、再换回右边,从第一次停下的位置”下标[8]”继续往前找,再找一个比“5”小的,然后停止,换到最后一次空余的位置[2]

4、再换左边,再找比“5”大的,然后换到右边空余的位置

………….

这样重复,最后这个空余的位置会相对推移到最中间,这个位置的左边所有的数字都是小于“5”的,而它右边所有的数字都是大于“5”的,这时还记得我们第一次就被替换的中轴“5”吗,将它放到最后空出的这个位置,就实现了一次中轴排序

而接下来要做的,就是在现在的”左“、”右“两边分别再选出一个中轴,进行和第一轮排序一样的步骤,这一轮排序完成后,左边也分成了两半, 右边也分成了两半, 把这四小份数组再来排序

一直这样排下去,最后不可分割时,整个数组就排序完成了。

下面分析主要代码,准备三个变量

int center=5; int small=0;  int big=10;
//center记录中轴的值、small记录每一次找到的小于中轴的成员下标,big用来记录每一次找到大于中轴的成员下标


1.开始第一轮顺序转移,现在目标将所有小于center的成员转移到center的左边,大于center的成员转移到右边

//将所有小于center的移到左边,大于center的移到右边
while(small<big){
//先从右向左移动下标找到一个比center小的数
while(small<big){
if(arg[big] < center){
//换位,如前面介绍交换完成arg[big]变成多余,然后停止
arg[small]=arg[big];
small++;
break;
}
big--;
}
//然后从左向右移动下标找到一个比center大的数
while(small<big){
if(arg[small]>center){
//换位,如前面介绍交换完成arg[small]变成多余,然后停止
arg[big]=arg[small];
big--;
break;
}
small++;
}

//结果:(原数组: 5、2、8、3、7、4、10、9、1、6)
//第一次循环:   1、2、8、3、7、4、10、9、8、6   small=2,big=7 (arg[small]=8,是多余的)
//第二次循环:   1、2、4、3、7、7、10、9、8、6   small=4,big=4 (arg[small]=7,是多余的)
//第三次循环:   small == big 循环结束
}

arg[small]=center; //将最后多余的arg[small]替换为中轴 center

//循环结束  结果为:1、2、4、3、5、7、10、9、8、6
//可以发现  我们选取的中轴 5  现在被转移到了中间,  且5的左边都小于5   右边都大于5

//这里模拟排序过程,代码在后面
//然后将5左右的成员用上面的方法 再进行一次排序(左边以1位中轴,右边以7为中轴)
(1、2、4、3) 5 (7、10、9、8、6)   //中轴“5”位置已确定

//第二次排序结果:
1 (2、4、3) 5 6 7 (9、8、10)  //中轴“1”和“7”以及独立在一边的“6”位置已确定
//在进行第三次排序,左边中轴为2 右边中轴为9

// 第三次排序结果:
1 2 (4、3) 5 6 7 8 9 10   //1、2、5、6、7、8、9、10位置已确定
//进行第四次排序,左边中轴为4,右边已结束,

//第四次排序结果:
1 2 3 4 5 6 7 8 9 10


代码:

import java.util.ArrayList;
import java.util.List;

public class QuickSort {

public static void sort(int[] list, int small, int big) {
if (small < big) {
int center = list[small];
int left=small;
int right=big;
while (left < right) {
//先从右开始遍历,找到一个比center大的值终止
while (left < right && list[right] > center) {
right--;
}
list[left]=list[right];
//再从左边遍历,找到一个比center小的值终止
while (left < right && list[left] < center) {
left++;
}
list[right]=list[left];
}
//加上中轴(排序完成后将中轴的值放在最后多余出来的元素上)
list[left]=center;

//第二轮排序
//本次排序完成后,左边的一半数组
sort(list, small, left - 1);
//本次排序完成后,右边的一半数组
sort(list, left+1, big);
}
}

public static void main(String args[]){
int[] sortList={5,2,8,3,7,4,10,9,1,6};
sort(sortList,0,sortList.length-1);

System.out.println("result:");
for(int i=0;i<sortList.length;i++){
System.out.print(sortList[i]+" ");
}
}

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: