1.快速排序的过程分析
进过我多次查找资料,快速排序的实现方式有很多,我这里简述一种代码简洁无bug的方式,无需添加很多的判断。
排序思想:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
以数组{4,7,6,3,2}
为例:
1.选取标志元素
我这里选择数组的第一个元素4作为标志元素,当然也可以选取其他,例如中间的元素,最后一个元素,实现思路略有不同。
2.排序过程
(1)从数组的最右侧开始找比4小的元素,找到2,使2,4交换位置,数组变为:
{2,7,6,3,4}
(2)从数组的最左侧开始找比4大的元素,找到2,2不是,下标加1,找到7,成立,使7,4交换位置,数组变为:
{2,4,6,3,7}
(3)从数组的最右侧开始找比4小的元素,找到3,使3,4交换位置,数组变为:
{2,3,6,4,7}
(4)从数组的最左侧开始找比4大的元素,找到6,成立,使6,4交换位置,数组变为:
{2,3,4,6,7}
排序结束
2.代码实现
package test1;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int arr[] = new int[]{4,7,6,3,2};
int len = arr.length - 1;
arr = qsort(arr, 0, len);
System.out.println(Arrays.toString(arr));
}
/**
*
* @param arr //需排序数组
* @param start//开始位置
* @param end//结束位置
* @return
*/
public static int[] qsort(int arr[], int start, int end) {
//标志元素
int pivot = arr[start];
int i = start;
int j = end;
//当开始位置小于结束位置时,一直循环
while (i < j) {
//从右边寻找,当有小于标志元素时停止,找到下标j
while ((i < j) && (arr[j] > pivot)) {
//向左寻找
j--;
}
//从左边寻找,当有大于标志元素时停止,找到下标i
while ((i < j) && (arr[i] < pivot)) {
//向右寻找
i++;
}
//此时,在数组的左侧找到大于标志元素的数的下标i,数为arr[i]
// 在数组的右侧找到小于标志元素的数的下标j,数为arr[j]
//如果arr[i] == arr[j],元素交换会陷入死循环
//时i向右移动一位,接下来如果从左边找到了比pivot大的数,就与arr[j]交换
if ((arr[i] == arr[j]) && (i < j)) {
i++;
} else {
//元素交换
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
//此时i=j,递归
//左边
if (i - 1 > start)
arr = qsort(arr, start, i - 1);
//右边
if (j + 1 < end)
arr = qsort(arr, j + 1, end);
return (arr);
}
}
3.快速排序测试
8万条随机数排序测试
也就15毫秒。。。
快速排序的平均时间复杂度也是O(nlog2n)