快速排序算法介绍
快速排序算法
简介
快速排序是对冒泡排序的一种改进,通过一趟排序将要排序的数据序列分成独立的俩部分,其中一部分的所有数据比另一部分的所有数据都要小,然后按此方法对两部分数据分别进行快速排序,整个排序过程递归进行,最终使整个数据序列变成有序的数据序列。
原理
选择一个关键值作为基准值(一般选择第1个元素为基准元素),将比基准值大的都放在右边的序列中,将比基准值小的都放在左边的序列中。
循环过程
从后向前比较,用基准值和做后一个值进行比较。如果比基准值小,则交换位置;如果比基准值大,则继续比较下一个值,直到找到第1个比基准值小的值才交换位置。
在从后向前找到第1个比基准值小的值并交换位置后,从前向后开始比较。如果有比基准值大的,则交换位置;如果没有,则继续比较下一个,直到找到第1个比基准值大的值才交换位置。
重复执行以上过程,直到从前向后比较的索引大于等于从后向前比较的索引,则结束一次循环。这时对于基准值来说,左右两边都是有序的数据序列。
重复循环以上过程,分别比较左右两边的序列,直到整个数据序列有序。
show code
快速排序算法Java实现
public static int[] quickSort(int[] arr, int low, int high) {
//从前向后比较的索引
int start = low;
//从后向前比较的索引
int end = high;
//基准值
int key = arr[low];
while (end > start) {
//从后向前比较
while (end > start && arr[end] >= key) {
end--;
}
//如果没有比基准值小的,则比较下一个,直到有比基准值小的,则交换位置,然后又从前向后比较
if (arr[end] <= key) {
int temp = arr[end];
arr[end] = arr[start];
arr[start] = temp;
}
//从前向后比较
while (end > start && arr[start] <= key) {
start++;
}
//如果没有比基准值大的,则比较下一个,直到有比基准值大的,则交换位置
if (arr[start] >= key) {
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
//此时第1此循环比较结束,基准值的位置已经确定,左边的值都比关键值小,右边的值逗比关键值大,但是两边的顺序还有可能不一样,接着进行下面的递归调用
}
if (start > low) quickSort(arr, low, start - 1);
if (end < high) quickSort(arr, end + 1, high);
return arr;
}
测试
public static void main(String[] args) {
int[] array = new int[5];
array[0] = 6;
array[1] = 9;
array[2] = 5;
array[3] = 7;
array[4] = 8;
System.out.println("排序前" + JSON.toJSONString(array));
System.out.println("排序后"+JSON.toJSONString(quickSort(array,0,array.length-1)));
}
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!