2025-01-16 快速排序
This commit is contained in:
parent
4bbb9ec2de
commit
64b537761a
97
src/dataANDcalc/java/SortAlgori/QuickSort.java
Normal file
97
src/dataANDcalc/java/SortAlgori/QuickSort.java
Normal file
@ -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<arr.length-1; i++){
|
||||
if(arr[i]<mid){
|
||||
swap(i,index);
|
||||
index ++;
|
||||
}
|
||||
}
|
||||
swap(index,arr.length-1);
|
||||
}
|
||||
|
||||
/**
|
||||
* 以数组中间的元素作为基准数
|
||||
* @param left
|
||||
* @param right
|
||||
*/
|
||||
private void midQuicksort(int left, int right){
|
||||
if(left >= 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");
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user