排序算法
快排序:平均时间复杂度为o(nlogn)
其主要思想就是
1.先从数列中取出一个数作为基准数。
2.将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.左右区间重复第二步,直到各区间只有一个数。
1 public void quickSort(int[] arr, int x, int y) { 2 if (x < y) { 3 int index = partition(arr, x, y); 4 quickSort(arr, x, index-1); 5 quickSort(arr, index+1, y); 6 } 7 } 8 9 public int partition(int[] arr, int i, int j) { 10 int left = i, right = j; 11 int temp = arr[i]; 12 while (left < right) { 13 14 while (left < right && temp <= arr[right]) { 15 right--; 16 } 17 if (left < right) { 18 arr[left] = arr[right]; 19 } 20 21 while (left < right && temp > arr[left]) { 22 left++; 23 } 24 25 if (left < right) { 26 arr[right] = arr[left]; 27 } 28 } 29 arr[left] = temp; 30 return left; 31 }
归并排序:是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。最大 最小和平均时间复杂度都为nlogn。
1 public void mergeSort(int[] arr, int i, int j) { 2 if (i < j) { 3 int mid = (i + j) / 2; 4 mergeSort(arr, i, mid); 5 mergeSort(arr, mid + 1, j); 6 merge(arr, i, j, mid); 7 } 8 } 9 //合并 10 public void merge(int[] arr, int left, int right, int mid) { 11 int[] temp = new int[arr.length]; 12 int i = left; 13 int j = mid + 1; 14 int t = 0; 15 16 while (i <= mid && j <= right) { 17 if (arr[i] <= arr[j]) { 18 temp[t++] = arr[i++]; 19 } else { 20 temp[t++] = arr[j++]; 21 } 22 } 23 24 while (i <= mid) { 25 temp[t++] = arr[i++]; 26 } 27 28 while (j <= right) { 29 temp[t++] = arr[j++]; 30 } 31 32 t = 0; 33 while (left <= right) { 34 arr[left++] = temp[t++]; 35 } 36 }
冒泡排序:上浮法或者下沉法。将数组中的值逐个比较,将其移动到数组的上面。
上浮法冒泡:时间复杂度o(n)
1 public void mSort(int[] arr){ 2 for (int i = 0; i < arr.length; i++) { 3 int temp = arr[i]; 4 for (int j = i + 1; j < arr.length; j++) { 5 if (arr[j] < temp) { 6 temp = arr[j]; 7 arr[j] = arr[i]; 8 arr[i] = temp; 9 } 10 } 11 } 12 }
插入排序:
1 public void insertSort(int[] arr) { 2 for (int i = 0; i < arr.length; i++) { 3 for (int j = i; j > 0; j--) { 4 if (arr[j - 1] > arr[j]) { 5 int temp = arr[j]; 6 arr[j] = arr[j - 1]; 7 arr[j - 1] = temp; 8 } 9 } 10 } 11 }