2025-01-17 归并排序
This commit is contained in:
parent
a041c9c815
commit
84c33359e7
82
src/dataANDcalc/java/SortAlgori/MergeSort.java
Normal file
82
src/dataANDcalc/java/SortAlgori/MergeSort.java
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
package SortAlgori;
|
||||||
|
|
||||||
|
public class MergeSort {
|
||||||
|
|
||||||
|
private int[] arr;
|
||||||
|
|
||||||
|
private int[] temp;
|
||||||
|
|
||||||
|
public MergeSort(int[] arr){
|
||||||
|
this.arr = arr;
|
||||||
|
// this.arr = new int[]{8,4,5,7,1,3,6,2};
|
||||||
|
this.temp = new int[arr.length];
|
||||||
|
}
|
||||||
|
|
||||||
|
public void mergeSort(int left, int right){
|
||||||
|
while(left >= right){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int mid = (left + right)/2;
|
||||||
|
mergeSort(left,mid);
|
||||||
|
mergeSort(mid+1,right);
|
||||||
|
|
||||||
|
int leftIndex = left;
|
||||||
|
int rightIndex = mid+1;
|
||||||
|
int index = left;
|
||||||
|
while(index <= right){
|
||||||
|
if(arr[leftIndex] <= arr[rightIndex]){
|
||||||
|
temp[index] = arr[leftIndex];
|
||||||
|
leftIndex ++;
|
||||||
|
index ++;
|
||||||
|
}else{
|
||||||
|
temp[index] = arr[rightIndex];
|
||||||
|
rightIndex ++;
|
||||||
|
index ++;
|
||||||
|
}
|
||||||
|
if(leftIndex > mid){
|
||||||
|
while(rightIndex <= right){
|
||||||
|
temp[index] = arr[rightIndex];
|
||||||
|
rightIndex ++;
|
||||||
|
index ++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(rightIndex > right){
|
||||||
|
while(leftIndex <= mid){
|
||||||
|
temp[index] = arr[leftIndex];
|
||||||
|
leftIndex ++;
|
||||||
|
index ++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i=left; i<=right; i++){
|
||||||
|
arr[i] = temp[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
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] + " ");
|
||||||
|
}
|
||||||
|
MergeSort mergeSort = new MergeSort(arr);
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
|
mergeSort.mergeSort(0,arr.length-1);
|
||||||
|
long endTime = System.currentTimeMillis();
|
||||||
|
System.out.println("排序后的序列:");
|
||||||
|
mergeSort.show();
|
||||||
|
System.out.println("排序所花费的时间:" + (endTime - startTime) + "ms");
|
||||||
|
}
|
||||||
|
}
|
@ -40,11 +40,14 @@ public class QuickSort {
|
|||||||
}
|
}
|
||||||
int leftIndex = left;
|
int leftIndex = left;
|
||||||
int rightIndex = right;
|
int rightIndex = right;
|
||||||
|
// 以中间的数作为基准
|
||||||
int mid = arr[(left+right)/2];
|
int mid = arr[(left+right)/2];
|
||||||
while (leftIndex < rightIndex){
|
while (leftIndex < rightIndex){
|
||||||
|
// 如果当前左游标小于中间数,则继续往下找,直到找到一个大于mid的数
|
||||||
while (arr[leftIndex] < mid){
|
while (arr[leftIndex] < mid){
|
||||||
leftIndex ++;
|
leftIndex ++;
|
||||||
}
|
}
|
||||||
|
// 如果当前右游标大于中间数,则继续往上找,直到找到一个小于mid的数
|
||||||
while (arr[rightIndex] > mid){
|
while (arr[rightIndex] > mid){
|
||||||
rightIndex --;
|
rightIndex --;
|
||||||
}
|
}
|
||||||
@ -52,6 +55,7 @@ public class QuickSort {
|
|||||||
if(leftIndex >= rightIndex){
|
if(leftIndex >= rightIndex){
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// 将当前找到左右游标进行一次交换
|
||||||
swap(leftIndex,rightIndex);
|
swap(leftIndex,rightIndex);
|
||||||
|
|
||||||
// 如果交换完后发现arr[leftIndex] == mid,rightIndex--,防止出现死循环
|
// 如果交换完后发现arr[leftIndex] == mid,rightIndex--,防止出现死循环
|
||||||
|
Loading…
Reference in New Issue
Block a user