经典排序算法之快速排序详解
Posted Dream_it_possible!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典排序算法之快速排序详解相关的知识,希望对你有一定的参考价值。
前言
什么是快速排序? 这是我之前遇到的一个面试题,当时没回答来,我只写过冒泡排序、选择排序、插入排序呀,啥是快速排序,委屈巴巴, 一首凉凉送我自己。
1. 什么是快速排序算法?
快速排序算法是对冒泡排序算法的一种改进,没有冒泡排序两两相邻之间的比较换位,主要采用的思想是通过递归+独立排序的形式将无序的数列进行分割成可以独立排序的2部分数列,其中一部分数列比另外一部书数列小,每次排序两个独立的数列,直到排序完毕,即可完成最终的排序。
2. 快速排序的原理
1) 从左边定义一个i =0,右边定义一个j= arr.length-1 , 定义第一个分界值为 a[0], i++ ,直到找到第一个比a[i]大的值,然后a[i]与a[j] 互换位置。
2) 从右边定义一个j, j--, 找到比第一个比a[0]小的值a[j]与a[i]互换位置。
3) 如果循环的i-1>start 或 j+1>end, 那么重复步骤1 ) 2) ,直到 i==j,循环结束, 排序完毕。
3. 代码实现
package sort;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] a = new int[10];
a[0] = 46;
a[1] = 38;
a[2] = 67;
a[3] = 79;
a[4] = 15;
a[5] = 16;
a[6] = 5;
a[7] = 56;
a[8] = 47;
a[9] = 13;
System.out.println(Arrays.toString(a));
int start = 0;
int end = a.length - 1;
int[] result = quickSort(a, start, end);
System.out.println(Arrays.toString(result));
}
public static int[] quickSort(int[] params, int start, int end) {
int v = params[start];
int i = start;
int j = end;
while (i < j) {
//从小到大排序
while ((i < j) && params[j] > v) {
j--;
}
while ((i < j) && params[i] < v) {
i++;
}
if ((params[i] == params[j]) && (i < j)) {
i++;
} else {
if (i != j) {
swap(i, j, params);
System.out.println("结果为:" + Arrays.toString(params));
}
}
if (i - 1 > start) {
params = quickSort(params, start, i - 1);
}
if (j + 1 < end) {
params = quickSort(params, j + 1, end);
}
}
return params;
}
public static void swap(int index1, int index2, int[] arr) {
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
}
打印结果:
[46, 38, 67, 79, 15, 16, 5, 56, 47, 13]
结果为:[13, 38, 67, 79, 15, 16, 5, 56, 47, 46]
结果为:[13, 38, 46, 79, 15, 16, 5, 56, 47, 67]
结果为:[13, 38, 5, 79, 15, 16, 46, 56, 47, 67]
结果为:[13, 38, 5, 79, 15, 16, 46, 47, 56, 67]
结果为:[13, 38, 5, 46, 15, 16, 79, 47, 56, 67]
结果为:[5, 38, 13, 46, 15, 16, 79, 47, 56, 67]
结果为:[5, 13, 38, 46, 15, 16, 79, 47, 56, 67]
结果为:[5, 13, 38, 16, 15, 46, 79, 47, 56, 67]
结果为:[5, 13, 38, 16, 15, 46, 67, 47, 56, 79]
结果为:[5, 13, 38, 16, 15, 46, 56, 47, 67, 79]
结果为:[5, 13, 38, 16, 15, 46, 47, 56, 67, 79]
结果为:[5, 13, 15, 16, 38, 46, 47, 56, 67, 79]
[5, 13, 15, 16, 38, 46, 47, 56, 67, 79]
由打印结果可知,快速排序的效率是非常高的, 单次排序即可挪动两边数据进行大小比较。
以上是关于经典排序算法之快速排序详解的主要内容,如果未能解决你的问题,请参考以下文章