6种主要排序方式
/** * 插入排序法 ---简单插入排序排序 整体思路--后面得元素向前搜索 其插入位置 */ static void InsertSort(int[] sqList, boolean is_smallTbig) { // is_smallTbig排练方式 //不放入for中是因为考虑算法运行速度 int sentinel = 0;// 哨兵 int j, i; if (is_smallTbig) { for (i = 1; i < sqList.length; i++) { sentinel = sqList[i]; for (j = i - 1; j >= 0; j--) { if (sqList[j] > sentinel) // 小到大顺序 sqList[j + 1] = sqList[j];// 比sentinel大则向后移动 直到空出j的位置 else { break; } } sqList[j + 1] = sentinel; // 把sentinel 放到 空出的j的位置 因为for出来j-1了 // 所以j+1 } } else { for (i = 1; i < sqList.length; i++) { sentinel = sqList[i]; for (j = i - 1; j >= 0; j--) { if (sqList[j] < sentinel) // 大到小顺序 sqList[j + 1] = sqList[j];// 比sentinel大则向后移动 直到空出j的位置 else { break; } } sqList[j + 1] = sentinel; // 把sentinel 放到 空出的j的位置 因为for出来j-1了 // 所以j+1 } } } /** * 插入排序法 ---shell(希尔)排序(不稳定) */ static void ShellSort(int[] sqList, boolean is_smallTbig) { // 使数组部分有序 整体上 大(小)的在后面小(大)的在前面 时间复杂度为O(n^(3/2)) int[] step = { 9, 5, 3, 1 };// 最后一位必须为1 int s, t; int sentinel = 0;// 哨兵 if (is_smallTbig) { for (int i = 0; i < step.length; i++) { s = step[i]; // 取步长 for (int j = s; j < sqList.length; j++) { // 分组进行排序 组的步长就是S sentinel = sqList[j]; t = j - s; // 对步长为s的组进行排序 使之有序 for (; t >= 0 && (t <= sqList.length); t = t - s) { if (sentinel < sqList[t])// 小到大排序 { sqList[t + s] = sqList[t]; } else { break; } } sqList[t + s] = sentinel; } } } else { for (int i = 0; i < step.length; i++) { s = step[i]; // 取步长 for (int j = s; j < sqList.length; j++) { // 分组进行排序 组的步长就是S sentinel = sqList[j]; t = j - s; // 对步长为s的组进行排序 使之有序 for (; t >= 0 && (t <= sqList.length); t = t - s) { if (sentinel > sqList[t]) // 大到小排序 { sqList[t + s] = sqList[t]; } else { break; } } sqList[t + s] = sentinel; } } } } /** * 交换排序法-----冒泡排序 整体思路(已两两交换) 先找出数组中最大(小)的元素放在其位置 */ static void BubbleSort(int[] sqList, boolean is_smallTbig) { int sentinel = 0; int i = sqList.length, j = 0; if (is_smallTbig) { for (boolean change = true; i > 0 && change; i--) { change = false;// 如何已经有序则不用拍 for (j = 1; j < i; j++) { sentinel = sqList[j]; if (sentinel < sqList[j - 1]) { change = true; sqList[j] = sqList[j - 1]; sqList[j - 1] = sentinel; } } } } else { for (boolean change = true; i > 0 && change; i--) { change = false;// 如何已经有序则不用拍 for (j = 1; j < i; j++) { sentinel = sqList[j]; if (sentinel > sqList[j - 1]) { sqList[j] = sqList[j - 1]; sqList[j - 1] = sentinel; change = true; } } } } } /** * 交换排序法----- 快速排序 没有检测如入的合法性(不稳定) */ int myQuicksort(int a[], int indexI, int indexJ) { int tempindex, start = indexI, end = indexJ, res; tempindex = indexI; if (indexI < 0 || indexJ < 0) { res = 0; } if (indexI >= indexJ) { res = 0; } else { boolean swich = true; while (true) { if (swich) { if (a[indexJ] < a[tempindex]) { int t; t = a[indexJ]; a[indexJ] = a[tempindex]; a[tempindex] = t; tempindex = indexJ; swich = false; } else { indexJ--; } } else { if (a[indexI] > a[tempindex]) { int t; t = a[indexI]; a[indexI] = a[tempindex]; a[tempindex] = t; tempindex = indexI; swich = true; } else { indexI++; } } if (indexJ <= indexI) break; } res = myQuicksort(a, start, tempindex - 1); res = myQuicksort(a, tempindex + 1, end); } return res; } /** * 选择排序法-----简单选择排序(不稳定) */ static void selectSort(int[] sqList, boolean is_smallTbig) { int sentinel = 0, tempIndex = 0; if (is_smallTbig) { for (int i = 0; i < sqList.length; i++) { tempIndex = i; sentinel = sqList[i]; for (int j = i + 1; j < sqList.length; j++) { sentinel = (sentinel < sqList[j]) ? sentinel : sqList[tempIndex = j];// 记录最小值的index } sqList[tempIndex] = sqList[i]; sqList[i] = sentinel; } } else { for (int i = 0; i < sqList.length; i++) { sentinel = sqList[i]; tempIndex = i; for (int j = i + 1; j < sqList.length; j++) { sentinel = (sentinel > sqList[j]) ? sentinel : sqList[tempIndex = j]; } sqList[tempIndex] = sqList[i]; sqList[i] = sentinel; } } } /** * 选择排序法-----堆排(不稳定) */ public class HeapSort { public void sort(int[] number) { int[] tmp = new int[number.length + 1]; // 配合說明,使用一個有徧移的暫存陣列 for (int i = 1; i < tmp.length; i++) { tmp[i] = number[i - 1]; } createHeap(tmp); int m = number.length; while (m > 1) { swap(tmp, 1, m); m--; int p = 1; int s = 2 * p; while (s <= m) { if (s < m && tmp[s + 1] < tmp[s]) s++; if (tmp[p] <= tmp[s]) break; swap(tmp, p, s); p = s; s = 2 * p; } } // 這邊將排序好的暫存陣列設定回原陣列 for (int i = 0; i < number.length; i++) { number[i] = tmp[i + 1]; } } private void createHeap(int[] tmp) { int[] heap = new int[tmp.length]; for (int i = 0; i < heap.length; i++) heap[i] = -1; for (int i = 1; i < heap.length; i++) { heap[i] = tmp[i]; int s = i; int p = i / 2; while (s >= 2 && heap[p] > heap[s]) { swap(heap, p, s); s = p; p = s / 2; } } for (int i = 1; i < tmp.length; i++) tmp[i] = heap[i]; } private void swap(int[] number, int i, int j) { int t; t = number[i]; number[i] = number[j]; number[j] = t; } }
浙公网安备 33010602011771号