十大经典排序之一
这次研究一下快速排序,理解为找一个基准值,比他小的在他左边,比他大的在右边,然后反复循环这样的一分为二的步骤,知道无法改变位置,排序就此完成。
假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序
步骤1,选择左边第一位为 基准值,数组可以看作为,6 [1 ,2 ,7 ,9 , 3 , 4 , 5 ,10, 8]
首先最右边向左移,比6小的第一个数字是5
最左边向右移,比6大的第一个数字是7,
进行一次交换,6,[1 ,2 ,5 ,9 , 3 , 4 ,7 ,10, 8]
然后再一次从 5和7的位置重复步骤一
可以看到最右边向左移,比6小的第一个数字是4
最左边向右移,比6大的第一个数字是9,
进行一次交换,6,[ 1 ,2 ,5 ,4 , 3 , 9 ,7 ,10, 8 ]再一次重复以上步骤,发现右边向左移动的角标位置在3的位置不能动了,再移动就要碰上左边右移的位置了,而且3满足了比基准值小的要求,进行基准值的替换
变为 3,[1 ,2 ,5 ,4 , 6 , 9 ,7 ,10, 8]
此时第一次的循环完成了。 6的左边都是比他小的,右边都是比他大的
[3,1 ,2 ,5 ,4 , 6 , 9 ,7 ,10, 8]
再一次循环比较,但是此时可以看做2个数据了。 分别是 左边和右边
[3,1 ,2 ,5 ,4 ] 6 [ 9 ,7 ,10, 8]
[3,1 ,2 ,5 ,4 ] 做比较
3[1,2,5,4] ->最右角标在左移是到2的位置,最左向右移动时到2的位置,选择替换为 [2,1,3,5,4] 再次分割为2个数组,[2,1]3以及[5,4]
再次排序[2,1]和[5,4], 2为基准,比1大,换位,5为基准比4大,换位
[ 9 ,7 ,10, 8]看这一组数据 将9拿出来9[7,10,8] 首先从右向左移,找到8比基准小,然后从左向右移,找到10比基准大,进行换位 变成9[7,8,10],然后替换基准值为 [7,8,9,10] 分为左边数组[7,8]9以及右边[10]
对[7,8]进行排序,已经是顺序了
奉上代码可以进行测试
package JavabaseMAV.JavabaseMAV.paixu;
import java.util.Random;
public class mykuaipai {
/**
* @param args
*/
public static void main(String[] args) {
Random ran=new Random();
int[] array = new int[100];
for (int i = 0; i < 100; i++) {
array[i]=ran.nextInt(1000);
}
int[] sorted = sort(array);
System.out.println("最终结果");
for (int i : sorted) {
System.out.print(i + " ");
}
}
private static int[] sort(int[] array) {
return quickSort(array, 0, array.length - 1);
}
private static int[] quickSort(int[] arr, int left, int right) {
// 左边不能大于等于右边 否则返回 { 1, 3, 2, 5 };
if (left >= right) {
return arr;
}
// 设置最左边的为基准点p
int p = arr[left]; //1
int i=left;
int j=right;
// 吧排序中比p大的放右边 比p小的放左边
while(i<j){
//最右边的j左移找到一个比p小的值,并且角标不能小于等于最左向右移的角标,不可碰撞
while(arr[j]>=p&&i<j){
j--;
}
//i右移找到一个比p大的,并且角标不能大于等于最左向右移的角标,不可碰撞
while(arr[i]<=p&&i<j){
i++;
}
//i和j交换 找到一对这样的值了,进行位置互换
if(i<j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
//完成了一次基准值的比较,现在左边全是比基准小的,右边全是比基准大的
//更换排序的基准位置以及比较值
arr[left]=arr[i];
arr[i]=p;
// 基准值的左边排序
quickSort(arr,left,i-1);
// 基准值的右边排序
quickSort(arr,i+1,right);
return arr;
}
}