//插入排序 voidInsertSort(int* a, int n) { for (int i = 0; i < n - 1; i++)//注意i的取值 { int end = i; int tmp = a[end + 1]; while (end >= 0) { if (a[end] > tmp)//这里只能写tmp不能写成a[end+1](每一次循环都要改变) { a[end + 1] = a[end]; end--; } else break; } a[end + 1] = tmp; } }
// 希尔排序 voidShellSort(int* a, int n) { int gap = n; while (gap > 1) { gap = gap / 3 + 1;//决定了时间复杂度,保证最后一次gap为1 for (int i = 0; i < n - gap; i++)//一个个组分开排 { int end = i; int tmp = a[end + gap]; while (end >= 0)//等于零也要排一次 { if (a[end] > tmp) { a[end + gap] = a[end];//换位子 end -= gap; } else break; } a[end + gap] = tmp;//插入 } } }
//选择排序 voidSelectSort(int* a, int n) { int start = 0; int end = n - 1; while (end > start) { int mini = start; int maxi = end; for (int i = start; i <= end; i++) { if (a[mini] > a[i]) mini = i; if (a[maxi] < a[i]) maxi = i; } if (mini == end) { Swap(&a[maxi], &a[end]); mini = maxi; Swap(&a[mini], &a[start]); } else { Swap(&a[maxi], &a[end]); Swap(&a[mini], &a[start]); } end--; start++; } }
//冒泡排序 voidBubbleSort(int* a, int n) { for (int i = n; i > 0; i--) { int prev = 0; int cur = 1; int falg = 1; while (cur < i) { if (a[prev] > a[cur]) { falg = 0; Swap(&a[prev], &a[cur]); } prev = cur; cur++; } if (falg == 1) break; } }
voidQuickSort(int* a, int left, int right) { if (left >= right) return; if (right - left + 1 < 10) { InsertSort(a + left, right - left + 1);//小区间优化 return; }
//hoare版本 intpartsort1(int* a, int left, int right) { int x = Midofthree(a, left, right, (left + right) / 2);//防止时间复杂度退化 Swap(&a[x], &a[left]); int key = a[left]; int begin = left, end = right; while (begin < end) { while (begin < end && key <= a[end])//先右边找小 end--;
while (begin < end && key >= a[begin])//再左边找大 begin++;
//双指针版本 intpartsort2(int* a, int left, int right) { int x = Midofthree(a, left, right, (right + left) / 2); Swap(&a[x], &a[left]); int keyi = left; int prev = left; int cur = prev + 1; while (cur <= right) { if (a[cur] < a[keyi] && ++prev != cur) Swap(&a[cur], &a[prev]);
//挖坑版本 intpartsort3(int* a, int left, int right) { int x = Midofthree(a, left, right, (right + left) / 2); Swap(&a[x], &a[left]); int key = a[left]; int pit = left; int begin = left; int end = right; while (begin < end) { while (a[end] >= key && begin < end) end--;
voidQuickSort(int* a, int left, int right) { if (left >= right) return; if (right - left + 1 < 10) { InsertSort(a + left, right - left + 1);//小区间优化 return; }
voidMergeSortNonR(int* a, int n) { int* tmp = (int*)malloc(sizeof(int) * n); if (tmp == NULL) { perror("malloc is fail"); return; } int gap = 1; while (gap < n) { for (int i = 0; i < n; i += 2 * gap) { int begin1 = i, end1 = i + gap - 1; int begin2 = i + gap, end2 = i + 2 * gap - 1; int j = i; if (begin2 >= n) break; if (end2 >= n) end2 = n - 1; while (begin1 <= end1 && begin2 <= end2) { if (a[begin1] <= a[begin2]) tmp[j++] = a[begin1++]; else tmp[j++] = a[begin2++]; } while (begin1 <= end1) tmp[j++] = a[begin1++];
while (begin2 <= end2) tmp[j++] = a[begin2++];
memcpy(a + i, tmp + i, sizeof(int) * (end2 - i + 1)); } gap *= 2; } free(tmp); tmp = NULL; }
voidCountSort(int* a, int n) { int min = a[0]; int max = a[0]; for (int i = 0; i < n; i++) { if (a[i] > max) max = a[i]; if (a[i] < min) min = a[i]; } int range = max - min + 1; int* x = (int*)calloc(range, sizeof(int)); if (x == NULL) { perror("calloc is fail"); return; } for (int i = 0; i < n; i++) x[a[i] - min]++;
int j = 0; for (int i = 0; i < n; i++) while (x[i]--) a[j++] = i + min;