/** * Created by itworker365 on 5/10/2017. */ public class SortTest { public static void main (String[] args) { //期待结果,1234579 int[] a = {2,3,1,5,4,9,7}; quickSort(a, 0, a.length - 1); printArray(a); } //冒泡排序,相邻元素依次比较,每次将最大元素沉淀到后排位置 public static void bubbleSort (int[] a) { for (int i = 0; i < a.length - 1; i++) { //length - i - 1 每次沉淀后位置已经正确,无需多余比较,可以添加哨兵,一次没有改变就可以停止 for (int j = 0; j < a.length - i - 1; j++) { if (a[j + 1] < a[j]) { int temp = a[j + 1]; a[j + 1] = a[j]; a[j] = temp; } } } } //插入排序,将取出元素与前面已经排序的元素对比,插入到正确的位置 public static void insertSort (int[] a) { for (int i = 1; i < a.length - 1; i++) { if (a[i] < a[i - 1]) { int curr = a[i]; int j ; a[i] = a[i - 1]; for (j = i - 1; j >= 0 && curr < a[j]; j--) { a[j + 1] = a[j]; } a[j + 1] = curr; } } } //选择排序,从队列当前位置向后找到最小元素,替换到当前位置 public static void selectSort (int[] a) { for (int i = 0; i < a.length - 1; i++) { int minPos = i; int min = a[i]; int curr = a[i]; for (int j = i + 1; j < a.length; j++) { if (a[j] < min) { min = a[j]; minPos = j; } } a[i] = min; a[minPos] = curr; } } //归并排序,将数组逐级拆分到两个子序列排序,归并 public static void mergeSort (int[] a, int left, int right) { if (left < right) { int mid = (left + right) / 2; mergeSort(a, left, mid); mergeSort(a, mid + 1, right); merge(a, 0, mid, a.length - 1); } } private static void merge (int [] a, int start, int mid, int end) { int [] temparray = new int[end - start + 1]; int tempIndex = 0; int leftstart = start; int rightstart = mid + 1; while (leftstart <= mid && rightstart <= end) { if (a[leftstart] <= a[rightstart]) { temparray[tempIndex++] = a[leftstart++]; } else { temparray[tempIndex++] = a[rightstart++]; } } while (leftstart <= mid) { temparray[tempIndex++] = a[leftstart++]; } while (rightstart <= end) { temparray[tempIndex++] = a[rightstart++]; } for (int i = 0; i < a.length; i++) { a[i] = temparray[i]; } } //快速排序,先按照首元素为中间,从最右指针开始遍历,遇见小于的再从左往右,找到第一个大于,交换。最后分为左小右大 public static void quickSort (int[] a, int left, int right) { if (left < right) { int mid = getPartitioned(a, left, right); quickSort(a, left, mid); quickSort(a, mid + 1, right); } } public static int getPartitioned(int[] a, int left, int right) { int temp = a[left]; while (left < right) { while (left < right && a[right] >= temp) { right--; } a[left] = a[right]; while (left < right && a[left] <= temp) { left++; } a[right] = a[left]; } a[left] = temp; return left; } //从队列中某个位置向后找到最小元素 public static void selectMin (int[] a, int pos) { int minPos = pos; int min = a[pos]; for (int i = pos; i < a.length - 1; i++) { if (a[i] < min) { min = a[i]; minPos = i; } } System.out.println("min value: " + min + " min pos: " + minPos); } private static void printArray(int[] a) { for (int i = 0; i < a.length; i++) { System.out.println(a[i]); } } }