一定要熟悉的排序
1.直接插入排序
void InsertSort(int[] a, int n) { for (int i = 1; i < n; i++) { if (a[i] < a[i - 1]) { // 若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入 int x = a[i]; // 复制为哨兵,即存储待排序元素 int j = 0; for (j = i - 1; j >= 0; j--) {// 查找在有序表的插入位置 if (x >= a[j]) { break; } a[j + 1] = a[j];// 元素后移 } a[j + 1] = x; // 插入到正确位置 } } }
2.shell排序
/* * 设初始序列有n个元素,选定一个小于n大于或等于1的整数gap作为间隔,将全部元素分成子序列, * 所有距离为gap的元素放在同一个子序列中,在每个子序列中分别采用直接插入算法进行排序;然后缩小间隔gap,如令gap=gap/2, * 重复上面的子序列划分和子序列排序动作;直到最后gap=1,将所有的元素放到一个序列中为止。 */ void shellSort(int[] number) { int gap = number.length / 2; // 一个组合中两个元素的差也是组合类型数 while (gap > 0) { for (int k = 0; k < gap; k++) { for (int i = k + gap; i < number.length; i += gap) { // 遍历子序列中的元素,插入排序 for (int j = i - gap; j >= k; j -= gap) { if (number[j] > number[j + gap]) { swap(number, j, j + gap); } else break; } } } gap /= 2; } } void swap(int[] number, int i, int j) { int t; t = number[i]; number[i] = number[j]; number[j] = t; }
3.选择排序
void selectSort(int a[], int n) { for (int i = 0; i < n; i++) { int k = i; for (int j = i + 1; j < n; j++) { // 选择最小的元素 if (a[k] > a[j]) k = j; } if (k != i) { int tmp = a[i]; a[i] = a[k]; a[k] = tmp; // 最小元素与第i位置元素互换 } } }
4.冒泡排序
void bubbleSort(int r[], int n) { int i = n - 1; // 初始时,最后位置保持不变 while (i > 0) { int pos = 0; // 每趟开始时,无记录交换 for (int j = 0; j < i; j++) if (r[j] > r[j + 1]) { pos = j; // 记录交换的位置 int tmp = r[j]; r[j] = r[j + 1]; r[j + 1] = tmp; } i = pos; // 为下一趟排序作准备 } }
5.快速排序
void quickSort(int R[], int low, int high) { if (low < high) { int pos = Partition(R, low, high); quickSort(R, low, pos - 1); quickSort(R, pos + 1, high); } } int Partition(int[] r, int i, int j) { int pivot = r[i]; while (i < j) { while (i<j && r[j] >= pivot) { j--; } if (i < j) { r[i] = r[j]; i++; } while (i<j && r[i] <= pivot) { i++; } if (i < j) { r[j] = r[i]; j--; } } r[i] =pivot;//确定r[pos]的位置 return i; }