题解 | #排序#
排序
http://www.nowcoder.com/practice/2baf799ea0594abd974d37139de27896
public int[] MySort (int[] arr) {
//return QuickSort(arr,0,arr.length-1);
return ShellSort(arr);
}
// 1、比较类排序
//1.1交换类排序--冒泡排序(超时) 时间复杂度 平均O(n^2) 最坏O(n^2) 最好O(n) 空间复杂度O(1) 稳定
public int[] BubbleSort (int[] arr) {
boolean flag = true;
for(int i = 0;i<arr.length-1;i++){
for(int j = 0;j<arr.length-i-1;j++){
if(arr[j]>arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
flag = false;
}
}
if(flag){
break;
}else{
flag = true;
}
}
return arr;
}
//1.2.快速排序(通过) 时间复杂度 平均O(nlogn) 最坏O(n^2) 最好O(nlogn) 空间复杂度O(logn) 不稳定
public int[] QuickSort (int[] arr,int l,int r) {
if(l>=r) return null;
int i = l-1,j = r+1,mid = arr[(l+r)>>1],temp;
while(i<j){
do i++;while(arr[i]<mid);
do j--;while(arr[j]>mid);
if(i<j){
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
QuickSort(arr,l,j);
QuickSort(arr,j+1,r);
return arr;
}
//2、插入类排序
//2.1 简单插入排序(超时) 时间复杂度 平均O(n^2) 最坏O(n^2) 最好O(n) 空间复杂度O(1) 稳定
public int[] InsertSort (int[] arr) {
int value,index;
for(int i = 1;i<arr.length;i++){
value = arr[i];
index = i-1;
while(index >= 0 && value<arr[index]){
arr[index+1] = arr[index];
index --;
}
if(index+1!=i){
arr[index+1] = value;
}
}
return arr;
}
//2.2 希尔排序(通过) 时间复杂度 平均O(nlogn) 不稳定
public int[] ShellSort (int[] arr) {
for(int gap = arr.length/2; gap>0; gap/=2){
for(int i=gap;i<arr.length;i++){
int j = i;
int temp = arr[j];
if(arr[j]<arr[j-gap]){
while(j-gap>=0&&temp<arr[j-gap]){
arr[j] = arr[j-gap];
j-=gap;
}
arr[j] = temp;
}
}
}
return arr;
}
//3.选择排序(超时) 时间复杂度 平均O(n^2) 不稳定
public int[] SelectionSort(int arr[]) {
for (int i = 0; i < arr.length - 1; i++) {
int min = arr[i];
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
if (min > arr[j]) { //查找最小值
min = arr[j];
minIndex = j;
}
}
if (minIndex != i) { //如果开始的最小值一样则不需要交换
arr[minIndex] = arr[i];
arr[i] = min;
}
}
return arr;
}
