From 64b537761a1e89e4f4fcc6d4f8319010494c5f2f Mon Sep 17 00:00:00 2001 From: liangjinglin Date: Thu, 16 Jan 2025 22:00:04 +0800 Subject: [PATCH] =?UTF-8?q?2025-01-16=20=E5=BF=AB=E9=80=9F=E6=8E=92?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/SortAlgori/QuickSort.java | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 src/dataANDcalc/java/SortAlgori/QuickSort.java diff --git a/src/dataANDcalc/java/SortAlgori/QuickSort.java b/src/dataANDcalc/java/SortAlgori/QuickSort.java new file mode 100644 index 0000000..1035ba7 --- /dev/null +++ b/src/dataANDcalc/java/SortAlgori/QuickSort.java @@ -0,0 +1,97 @@ +package SortAlgori; + +public class QuickSort { + + private int[] arr; + + public QuickSort(int[] arr){ +// this.arr = new int[]{238,620,303,470,12,196,635,10,739,12}; + this.arr = arr; + } + + /** + * 已最后一个数作为基准(有待完善) + */ + //todo 1.如果基准数重复了 2.完整递归 + private void tailQuicksort(){ + int index = 0; + int mid = arr[arr.length-1]; + for(int i=0; i= right){ + return; + } + int leftIndex = left; + int rightIndex = right; + int mid = arr[(left+right)/2]; + while (leftIndex < rightIndex){ + while (arr[leftIndex] < mid){ + leftIndex ++; + } + while (arr[rightIndex] > mid){ + rightIndex --; + } + // 如果leftIndex >= rightIndex 说明左边全部是小于mid的数,右边全部是大于mid的数 + if(leftIndex >= rightIndex){ + break; + } + swap(leftIndex,rightIndex); + + // 如果交换完后发现arr[leftIndex] == mid,rightIndex--,防止出现死循环 + // 这两句判断是当数组中出现重复的数时,有可能会出现重复的数作为mid导致两个mid重复交换死循环 + if(arr[leftIndex] == mid){ + rightIndex --; + } + if(arr[rightIndex] == mid){ + leftIndex ++; + } + + } + midQuicksort(left,leftIndex-1); + midQuicksort(rightIndex+1,right); + } + + private void swap(int i, int j) { + int temp = arr[i]; + arr[i] = arr[j]; + arr[j] = temp; + } + + public void show(){ + for (int i = 0; i < arr.length; i++) { + System.out.print(arr[i] + " "); + } + System.out.println(); + } + + public static void main(String[] args) { + int[] arr = new int[80000]; + System.out.println("排序前的序列:"); + for(int i=0; i<80000; i++){ + arr[i] = (int)(Math.random()*100000); + System.out.print(arr[i] + " "); + } + QuickSort quickSort = new QuickSort(arr); + long startTime = System.currentTimeMillis(); + quickSort.midQuicksort(0,arr.length-1); + long endTime = System.currentTimeMillis(); + System.out.println("排序后的序列:"); + quickSort.show(); + System.out.println("排序所花费的时间:" + (endTime - startTime) + "ms"); + } + + +}