数据结构-排序之快速排序(使用Java代码实现)
Posted 没谱的曲
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构-排序之快速排序(使用Java代码实现)相关的知识,希望对你有一定的参考价值。
前言
最近在学习数据结构的排序算法时,学到了快速排序。对于快速排序的算法的具体实现过程有了一定了解,但在具体实现的时候出现了一些小问题。在和同学讨论和查阅资料过后打算使用java代码将其实现出来。
快速排序
快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
具体代码
排序部分
快速排序可以采用递归的方法实现
//快速排序
//排序思想:选出一个基准数,把比哨兵大的数放到基准数的右边,比基准数小的数放到基准数左边,
// 再使用同样的方法,对基准数前面部分和后面部分的数进行快速排序,最后获得一个有序的数组,
// 整个排序过程可以看做一个递归的过程。
public static void quickSort(int[] arr,int low , int high)
// low,high 为每次处理数组时的首、尾元素索引
// 当low==high是表示该序列只有一个元素,不必排序了
if (low >= high)
return;
// 选出哨兵元素和基准元素。这里左边的哨兵元素也是基准元素
int i = low, j = high, base = arr[low];
while (i < j)
// 右边哨兵从后向前找
while (arr[j] >= base && i < j)
j--;
// 左边哨兵从前向后找
while (arr[i] <= base && i < j)
i++;
swap(arr, i, j); // 交换元素
swap(arr, low, j); // 基准元素与右哨兵交换
// 递归调用,排序左子集合和右子集合
quickSort(arr, low, j - 1);
quickSort(arr, j + 1, high);
private static void swap(int[] arr, int i, int j)
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
输入数组
java中不能直接通过手动输入整个数组,所以我写了一个方法,实现调用方法输入数组,并且可以控制输入的数组长度。
public static int[] scanArray()
Scanner scanner = new Scanner(System.in);
System.out.println("\\r请输入需要排序的数组的长度:");
int length = scanner.nextInt();
System.out.println("\\r请输入每一位需要排序的数值:");
// 定义一个数组用于保存输入的数据
int[] arr = new int[length];
int digit = 1;
int maxDigit = digit;
for (int i = 0; i < arr.length; i++)
// 把数据按照从0开始的下标存入arr 数组
arr[i] = scanner.nextInt();
return arr;
实现排序
方法都封装完成后,我们就可以直接调用方法进行快速排序了,最后再输出排序后得到的数组
public static void main(String[] args)
int[] arr = scanArray();
quickSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
运行结果:
总结
快速排序是排序算法中效率相对较高的,但使用的人却是比较少,大家一般信手拈来的排序算法就是冒泡排序。因为冒泡排序主观,容易理解,而快速排序使用到了递归,大家可能就有点不知所措了。
快速排序最优的情况下时间复杂度为:O( nlogn )
快速排序最差的情况下时间复杂度为:O( n^2 )
最优的情况下空间复杂度为:O(logn) ;每一次都平分数组的情况
最差的情况下空间复杂度为:O( n ) ;退化为冒泡排序的情况
以上是关于数据结构-排序之快速排序(使用Java代码实现)的主要内容,如果未能解决你的问题,请参考以下文章