排序算法
冒泡排序
(O(n2)/O(n)/O(n2)|O(1),稳定)
依次交换相邻元素最值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public void bubbleSort(int[] arr){ int temp = 0; boolean flag = false; for (int i = 1; i < arr.length-1; i++) { flag = false; for (int j = 0; j < arr.length-i; j++) { if(arr[j]>arr[j+1]){ temp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = temp flag = true } } if(!flag){ break; } } }
|
选择排序
(O(n2)/O(n2)/O(n2)|O(1),不稳定)
依次查询最值放在前面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public void selectSort(int[] arr){ int min = 0; int index = 0; for(int i= 0;i< arr.length-1;i++){ min = arr[i]; index = i; for(int j=i+1;j<arr.length;j++){ if(min>arr[j]){ min = arr[j]; index = j; } } if(index!=i){ arr[index] = arr[i]; arr[i] =min; } } }
|
插入排序
(O(n2)/O(n)/O(n2)|O(1),稳定)
序列分为有序序列和无序序列,依次从无序序列插入值到有序序列中
1 2 3 4 5 6 7 8 9 10 11 12 13
| public void insertSort(int[] arr){ int insertVal = 0; int index = 0; for(int i=1;i<arr.length;i++){ insertVal = arr[i]; index = i-1; while(index>=0 && insertVal < arr[index]){ arr[index+1] = arr[index]; index--; } arr[index+1] = insertVal; } }
|
快速排序-冒泡排序PRO
(O(nlog2n)/O(nlog2n)/O(n2)|O(nlog2n),不稳定)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public void quickSort(int[] arr,int low,int high){ int tmp = arr[low]; int left = low; int right = high; if(left < high){ while(left<high && tmp <= arr[right]){ right--; } if(left<high){ arr[left++] = arr[right]; } while(left<high && tmp >= arr[left]){ left++; } if(left<high){ arr[right--] = arr[left]; } arr[left] = tmp; quickSort(arr,low,left-1); quickSort(arr,left+1,high); } }
|
希尔排序-插入排序PRO
(O(n1.3)/O(n)/O(n2)|O(1),不稳定)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| public void shellSort1(int[] arr){ int insertVal = 0; int insertIndex = 0; for(int gap = arr.length/2 ;gap>0 ;gap/=2){ for(int i=gap;i<arr.length;i++){ insertVal = arr[i]; insertIndex = i; while(insertIndex-gap>=0 && insertVal<arr[insertIndex-gap]){ arr[insertIndex] = arr[insertIndex-gap]; insertIndex-=gap; } arr[insertIndex] = insertVal; } } }
public void shellSort(int[] arr){ int tmp = 0; for(int gap = arr.length/2; gap >0; gap/=2){ for(int i=gap;i<arr.length;i++){ if(arr[i]>arr[i+gap]){ tmp = arr[i]; arr[i] = arr[i+gap]; arr[i+gap] = arr[i]; } } } }
|
归并排序
(O(nlog2n)/O(nlog2n)/O(nlog2n)|O(1),稳定)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| public void mergeSort(int[] arr,int low,int high){ if(low<high){ int mid = (low + high)/2; mergeSort(arr,low,mid); mergeSort(arr,mid+1,high); merge(arr,low,mid,high); } }
public void merge(int[] arr,int low ,int mid,int high){ int[] temp = new int[high-low+1]; int tempIndex = 0; int i = low; int j = mid+1; while(i<=mid&&j<=high){ if(arr[i]<=arr[j]){ temp[tempIndex++] = arr[i++]; }else{ temp[tempIndex++] = arr[j++]; } } while(i<=mid){ temp[tempIndex++] = arr[i++]; } while(j<=high){ temp[tempIndex++] = arr[j++]; } tempIndex=0; while(tempIndex<temp.length)){ arr[low++] = temp[tempIndex]; } }
|
堆排序
(O(nlog2n)/O(nlog2n)/O(nlog2n)|O(1),不稳定)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| public void heapOrder(int[] arr){ for(int i=arr.length/2-1;i>=0;i--){ adjustHeap(arr,i,arr.length) } int temp = 0; for(int i = arr.length-1;i>0;i--){ temp = arr[i]; arr[i] = arr[0]; arr[0] = temp; adjustHeap(arr,0,i); } } public void adjustHeap(int[] arr,int index,int length){ int temp = arr[index]; for(int i=2*index+1;i<length;i=2*i+1){ if(i+1<length && arr[i]<arr[i+1]){ i++; } if(temp<arr[i]){ arr[index] = arr[i]; index = i; }else{ break; } arr[i] = temp; } }
|