给你一个整数数组 nums,请你将该数组升序排列。
冒泡--超时了
选择排序--超时了
插入排序--1247ms
快排--935ms
public static int[] sortArray(int[] nums) {
quickSort(nums,0,nums.length-1);
return nums;
}
public static void quickSort(int[] arr,int start,int end){
if (start>=end) return;
int p=arr[start];
int left=start;
int right=end;
while(left<=right){
//从左端开始遍历,直到找到比p大的值
while (left<=right && arr[left]<p){
left++;
}
//从右端开始遍历,直到找到比p小的值
while (left<=right && arr[right]>p){
right--;
}
//开始交换
if (left<=right){
int temp=arr[left];
arr[left]=arr[right];
arr[right]=temp;
left++;
right--;
}
}
//左半段继续快排
quickSort(arr,start,right);
//右半段继续快排
quickSort(arr,left,end);
}
归并排序--9ms
class Solution {
public static int[] sortArray(int[] array) {
int[] temp=new int[array.length];
mergeSortImpI(array,0,array.length-1,temp);
return array;
}
public static void mergeSortImpI(int[] arr,int start,int end,int[] temp){
//1.边界
if (start>=end) return;
int mid=start+(end-start)/2;
mergeSortImpI(arr,start,mid,temp);//左边归并排序,使得左子序列有序
mergeSortImpI(arr,mid+1,end,temp);//右边归并排序,使得右子序列有序
merge(arr,start,mid,end,temp);//将两个有序子数组合并操作
}
public static void merge(int[]arr,int start,int mid,int end,int[]temp){
int left=start;
int right=mid+1;
int index=start;
while (left<=mid&&right<=end){
if (arr[left]<arr[right]) temp[index++]=arr[left++];
else temp[index++]=arr[right++];
}
while (left<=mid){ //将左边剩余元素填充进temp中
temp[index++]=arr[left++];
}
while (right<=end){ //将右序列剩余元素填充进temp中
temp[index++]=arr[right++];
}
for (index=start;index<=end;index++){ //将temp中的元素全部拷贝到原数组中
arr[index]=temp[index];
}
}
}
10个数组,每个数组有10000个元素,分别用各种排序算法对该10个数组排序,测试速度:
public static void main(String[] args) {
int[]array =new int[10000];
long start = System.currentTimeMillis();
for (int k = 0; k < 10; k++) {
for (int i = 0; i < array.length; i++) {
array[i]=(int)(Math.random()*100);
}
insertSort(array);
}
long end = System.currentTimeMillis();
System.out.print("插入排序总耗时:");
System.out.println((end-start)+"毫秒");
long start1 = System.currentTimeMillis();
for (int k = 0; k < 10; k++) {
for (int i = 0; i < array.length; i++) {
array[i]=(int)(Math.random()*100);
}
selectSort(array);
}
long end1 = System.currentTimeMillis();
System.out.print("选择排序总耗时:");
System.out.println((end1-start1)+"毫秒");
long start2 = System.currentTimeMillis();
for (int k = 0; k < 10; k++) {
for (int i = 0; i < array.length; i++) {
array[i]=(int)(Math.random()*100);
}
bubbleSort(array);
}
long end2 = System.currentTimeMillis();
System.out.print("冒泡排序总耗时:");
System.out.println((end2-start2)+"毫秒");
long start3 = System.currentTimeMillis();
for (int k = 0; k < 10; k++) {
for (int i = 0; i < array.length; i++) {
array[i]=(int)(Math.random()*100);
}
quickSort(array,0, array.length-1);
}
long end3 = System.currentTimeMillis();
System.out.print("快速排序总耗时:");
System.out.println((end3-start3)+"毫秒");
long start4 = System.currentTimeMillis();
for (int k = 0; k < 10; k++) {
for (int i = 0; i < array.length; i++) {
array[i]=(int)(Math.random()*100);
}
quickSort(array,0, array.length-1);
}
long end4 = System.currentTimeMillis();
System.out.print("归并排序总耗时:");
System.out.println((end4-start4)+"毫秒");
}