八大排序之快速排序(java实现)
一、快速排序原理(从小到大)
1.基本思想
通过一趟排序将待排序列分成两部分,若一部分比另一部分小,则可继续对这两部分继续排序,从而使整个待排序列变得有序。
2.算法描述
1)将数组中的一个数字作为基准数
2)一般将数组中左边第一个数字作为基准数,然后从两边开始遍历,左边找比基准数大的,右边找比基准数小的,都找到后交换两个数的位置,当两指针相遇时,将指针所指向的数于基准数交换,然后数组被分成了两部分。
3)递归地对上一步分出的两数组进行排序。
3.图示
这里只展示一轮,后续过程类似。
开始遍历
两边都遍历到,交换两数的位置
继续遍历
同样交换两数位置
继续遍历,两指针相遇
将两指针共同指向的数与及基准数交换位置
第一轮完成,此时基准数6的位置的有序的,数组被分成了两部分,左边的比基准数小,右边的比基准数大,对数组分成的两部分递归运用此方法即可得到有序数组
二、代码实现
public static void main(String[] args) { int[] nums = new int[]{6,1,2,5,4,3,9,7,10,8}; quickSort(nums,0, nums.length - 1); System.out.println(Arrays.toString(nums)); } public static void quickSort(int[] nums,int left,int right){ //进行判断 如果左边索引比右边的索引要大 是不合法的 直接使用 return 结束这个方法 if(left >= right){ return; } //基准数 int base = nums[left]; //i指向最左边 int i = left; //j指向最右边 int j = right; while (i != j){ //先由j 从 右向左检索比基准数小的,如果检索到比基准数小的就停下 while (nums[j] >= base && i < j){ j--; } // i 从左向右检索 while (nums[i] <= base && i < j){ i++; } //代码走到这里。i 和 j 都停下了,然后交换 i 和 j的位置元素 int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } // 如果while循环条件不成立,这就代表了 i和 j相遇了,就停止检索 //交换基准数和这个相遇位置的元素进行交换 nums[left] = nums[i]; //把基准数赋值给相遇位置的元素 nums[i] = base; //递归调用 quickSort(nums,left,i - 1); quickSort(nums,j + 1,right); }
下一篇:
Java 四种数据排序方法