数据结构与算法之快速排序
- 基本介绍
快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 - 排序示意图
- 代码实现
package com.datastrucate.sort;
import java.util.Arrays;
/**
* ClassName:QuickSort
* Package:com.datastrucate.sort
* Description:
*
* @Date:2021/5/14 15:15
* @Author:hm
*/
public class QuickSort {
public static void main(String[] args) {
int [] arr = { -9,78,0,-567,23,70};
System.out.println("希尔排序前:"+ Arrays.toString(arr));
//shellSortSwap(arr);
quickSort(arr,0,arr.length-1);
System.out.println("希尔排序后:"+ Arrays.toString(arr));
/* int[] arr = new int [80000];
//生成8万个随机数
for (int i = 0;i < 80000;i++){
arr[i] = (int)(Math.random()*80000);//范围为[0,80000)
}
long start = System.currentTimeMillis();
quickSort(arr,0,arr.length-1);//23毫秒
long end = System.currentTimeMillis();
System.out.println("用时:"+(end-start)+"毫秒");*/
}
/*
* 快速排序算法:
* 原理:快速排序算法(递归)从left排到right,
* (1)arr[left]作为标注数,
* (2)循环右边将小数放在左边,循环左边将大数放在右边,直到左右下标重合
* (3)将标注数赋给当前重合的下标数,递归排序左右两边的数
*/
public static void quickSort(int[] arr,int left,int right){
if(left < right) {//递归结束条件
int state =arr[left];//把数组中的第left+1个数作为标注数
//记录需要排序的下标
int low = left;
int high = right;
//循环找出比标注数大的数和比标注数小的数
while (low < high) {
//若右边下标数比标注数大则右边下标左移
while (low < high && arr[high] >= state) {
high--;
}
//否则将右边的小数替换左边的数
arr[low] = arr[high];
//若左边的数小于标注数,则左边的下标右移
while(low < high && arr[low] <= state){
low++;
}
//否则将左边的数替换右边所指定的下标数
arr[high] = arr[low];
}
//把标注数替换到左右下标重合的位置,即放在中间位置,此处就将数分割为两部分,左边数小于states,右边数大于states
arr[low] = state;//arr[high] = states
//分成两部分(递归)中间值为标注数
//排序小的一部分
quickSort(arr, left, low);
///排序大的一部分
quickSort(arr, low +1, right);
}
}
}