快速排序算法
1.选择第一个元素(a)作为一个坑,把它保存下来,然后先从右边开始找一个比它大的元素,将它们的位置互换
2.从右边找一个比a小的元素,然后交换它们的位置
3.依次类推,最后得到a为数组的中间元素
4.最后对a两边进行递归遍历得出数组
package datastructure.sort; /* @CreateTime 2021/9/14 20:30 @CreateBy cfk */ import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; public class QuickSorting { public static void main(String[] args) { int[] arr = {-9,78,0,23,-567,70}; quickSort(arr, 0, arr.length - 1); System.out.println(Arrays.toString(arr)); // 测试80000条数据 冒泡排序所需要的时间 1s // int[] arr = new int[80000]; // for (int i = 0; i < 80000; i++) { // arr[i] = (int) (Math.random()*8000000); // } // // SimpleDateFormat sdf = new SimpleDateFormat("yy-MM-dd HH:mm:ss"); // String s1 = sdf.format(new Date()); // System.out.println(s1); // // // quickSort(arr,0,arr.length-1); // // // String s2 = sdf.format(new Date()); // System.out.println(s2); } public static void quickSort(int[] arr, int left, int right){ //判断左节点要小于右节点 否则递归的时候 会出现数组越界 if (left < right) { int l = left; int r = right; //定义一个临时变量存储第一个元素 int x = arr[l]; //当左节点小于右节点时运行程序 while (l < r) { //从右边开始寻找比第一个元素小的元素 while (l < r && x <= arr[r]){ r--; } //找到后 把第一个元素赋值为找的元素 并且把指针右移 if (l < r) { arr[l] = arr[r]; l++; } //从左边开始寻找比第一个元素大的元素 while (l < r && x > arr[l]){ l++; } //找到后 把倒数第一个元素赋值为找的元素 并且把指针左移 if (l < r) { arr[r] = arr[l]; r--; } } //最后把最后一个位置填上第一个元素 此时此元素的左边全部小于它 右边全部大于它 //但是左右两边元素并不保证有序 arr[l] = x; //递归遍历左边所有的元素 quickSort(arr,left,l-1); //递归遍历右边所有的元素 quickSort(arr,l+1, right); } } }