voidBubbleSort(int data[], int n) { if (n == 1) return; for (int i = 0; i <= n - 2; i++) { // 定义一个布尔类型的标识符,指示数组是否有序 int flag = 1; for (int j = 0; j <= n - 2 - i; j++) { if (data[j] > data[j + 1]) { int temp = data[j]; data[j] = data[j + 1]; data[j + 1] = temp; // 一旦有交换说明数组可能无序 if (flag == 1) flag = 0; } } // 如果有序则不进行接下来的换位 if (flag) break; } }
选择排序
选择排序每次选择未排序元素的最小者,交换到前面。
1 2 3 4 5 6 7 8 9 10 11 12 13
voidSelectSort(int data[], int n) { for (int i = 0; i < n - 1; i++) { int index = i; for (int j = i + 1; j < n; j++) if (data[j] < data[index]) index = j; if (index != i) { int temp = data[index]; data[index] = data[i]; data[i] = temp; } } }
插入排序
插入排序每次将未排序元素的第一个向前插入到合适的位置。
1 2 3 4 5 6 7 8 9 10 11
voidInsertSort(int data[], int n) { for (int i = 1; i < n; i++) { if (data[i] >= data[i - 1]) continue; int temp = data[i]; int j; for (j = i - 1; j >= 0 && temp < data[j]; j--) data[j + 1] = data[j]; data[j + 1] = temp; } }
voidMSort(int data[], int left, int right) { if (left >= right) return; int n = right - left + 1; int center = (left + right) / 2; MSort(data, left, center); MSort(data, center + 1, right); // 两个有序数组的合并(以下是最容易理解的方式) int *tempArray = (int*)malloc(sizeof(int) * n); int l = left, r = center + 1; for (int i = 0; i < n; i++) { if (l > center) tempArray[i] = data[r++]; elseif (r > right) tempArray[i] = data[l++]; elseif (data[l] < data[r]) tempArray[i] = data[l++]; else tempArray[i] = data[r++]; } free(tempArray); }
voidMergeSort(int data[], int n) { if (n <= 1) return; MSort(data, 0, n - 1); }
// 构建大根堆(升序排序) voidBuildHeap(int data[], int n) { // 对所有非叶节点逆序进行下滤操作 for (int i = (n - 2) / 2; i >= 0; i--) Sink(data, n, i); }
voidHeapSort(int data[], int n) { // 构建大根堆 BuildHeap(data, n); // 开始排序 for (int i = n - 1; i > 0; i--) { swap(&data[0], &data[i]); Sink(data, i, 0); } }
voidQSort(int data[], int left, int right) { int n = right - left + 1; if (n <= 1) return; if (n == 2) { if (data[left] > data[right]) swap(&data[left], &data[right]); return; } // 计算枢轴元,采用三值取中值的方式 int center = (left + right) / 2; if (data[left] > data[center]) swap(&data[left], &data[center]); if (data[left] > data[right]) swap(&data[left], &data[right]); if (data[center] > data[right]) swap(&data[center], &data[right]); swap(&data[center], &data[right - 1]); int pivot = data[right - 1]; // 数组分割 int l = left; int r = right - 1; while (1) { while (data[++l] < pivot) {} while (data[--r] > pivot) {} if (l < r) swap(&data[l], &data[r]); else break; } swap(&data[l], &data[right - 1]); // 对划分的两个子数组进行排序 QSort(data, left, l - 1); QSort(data, l + 1, right); }
voidQuickSort(int data[], int n) { QSort(data, 0, n - 1); }