publicvoidswap(int[] a, int indexI, int indexJ){ if (a == null || indexI >= a.length || indexJ >= a.length) { System.out.println("a is null ,index out of bound"); return; } int tmp = a[indexI]; a[indexI] = a[indexJ]; a[indexJ] = tmp; }
冒泡排序实现
1 2 3 4 5 6 7 8 9 10 11
publicvoidbubbleSort(int[] input){ int rightSide = input.length; while (rightSide - 1 > 0) { // 控制比较次数,比较次数为 len-1 for (int i = 1; i < rightSide; i++) { //每轮下两两比较 if (input[i - 1] > input[i]) { swap(input, i - 1, i); } } --rightSide; } }
publicvoidmergeSort(int[] data){ int len = data.length; int[] tmp = newint[len]; mergeSortImplementRecur(data, 0, len - 1, tmp); }
//递归实现 privatevoidmergeSortImplementRecur(int[] data, int firstIndex, int lastIndex, int[] tmp){ if (firstIndex >= lastIndex) {//递归的截止条件 return; } int midIndex = (firstIndex + lastIndex) / 2; mergeSortImplementRecur(data, firstIndex, midIndex, tmp); mergeSortImplementRecur(data, midIndex + 1, lastIndex, tmp); mergeArray(data, firstIndex, midIndex, lastIndex, tmp); }
//非递归实现,TODO
privatevoidmergeArray(int[] data, int firstIndex, int midIndex, int lastIndex, int[] tmp){ int i = firstIndex; int n = midIndex; int j = midIndex + 1; int m = lastIndex; int k = 0; while (i <= n && j <= m) {//逐一比较,将小的放入到 tmp数组中 if (data[i] < data[j]) { tmp[k++] = data[i++]; } else { tmp[k++] = data[j++]; } } while (i <= n) {//两个数组长度不一致时 tmp[k++] = data[i++]; } while (j <= m) { tmp[k++] = data[j++]; } for (i = 0; i < k; i++) {//复制到tmp数组中 data[firstIndex + i] = tmp[i]; } }
publicvoidquickSort(int[] data, int start, int end){ if (start >= end) { return; } int base = data[start];//start 位置为基准值 int i = start; int j = end;
while (i < j) { while (i < j && data[j] >= base) {//从右往左找小于的位置 j j--; } if (i < j) { data[i++] = data[j]; } while (i < j && data[i] <= base) { //从左往右找大于基准值的i i++; } if (i < j) { data[j--] = data[i]; } } if (i == j) {//此时i为基准值的索引 data[i] = base; } quickSort(data, start, i - 1);//递归调用左序列 quickSort(data, i + 1, end);// 递归调用右序列 }
publicvoidquickSortOpt(int[] data, int start, int end){ if (end - start < MAX_SORT_NUMBER) {//优化1,小数据采用 直接插入法 insertSort(data, start, end); } else { while (start < end) {//优化2,尾递归减少调用栈 int i = start; int j = end;
//优化3。采用中值法,选择基准值 int mid = (start + end) / 2; if (data[start] > data[end]) { swap(data, start, end); } if (data[mid] > data[end]) { swap(data, mid, end); } if (data[mid] > data[start]) { swap(data, mid, start); } int base = data[start];
while (i < j) { while (i < j && data[j] >= base) { j--; } if (i < j) { data[i++] = data[j]; } while (i < j && data[i] <= base) { i++; } if (i < j) { data[j--] = data[i]; } } if (i == j) { data[i] = base; } quickSort(data, start, i - 1); start = i + 1;//优化2 尾递归 } } }
privatevoidinsertSort(int[] data, int start, int end){ for (int i = start + 1; i <= end; i++) { if (data[i - 1] > data[i]) { int tmp = data[i]; int j; for (j = i - 1; j >= 0 && tmp < data[j]; j--) { data[j + 1] = data[j]; } data[j + 1] = tmp; } } }