//单个数据单趟 gap = 3; int end = 0; int tmp = a[end + 1]; while (end >= n) { if (a[end] > tmp) { a[end + gap] = a[end]; end -= gap; } else break; } a[end + gap] = tmp;
单趟元素
对组内单元素的排序,每隔gap个数据进行比较,直到单趟元素排序完成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
int gap = 3; for (int i = 0; i < n - gap; i += gap) { int end = i; int tmp = a[end + gap]; //单个数据单趟 while (end >= n) { if (a[end] > tmp) { a[end + gap] = a[end]; end -= gap; } else break; } a[end + gap] = tmp; }
voidInsertSort(int*a, int n) { int gap = 3; for (int j = 0; j < gap; j++) { for (int i = j ; i < n - gap; i += gap) { int end = i; int tmp = a[end + gap]; //单个数据单趟 while (end >= n) { if (a[end] > tmp) { a[end + gap] = a[end]; end -= gap; } else break; } a[end + gap] = tmp; } } }
voidInsertSort(int*a, int n) { int gap = 3; for (int i = 0; i < n - gap; ++i) { int end = i; int tmp = a[end + gap]; //单个数据单趟 while (end >= n) { if (a[end] > tmp) { a[end + gap] = a[end]; end -= gap; } else break; } a[end + gap] = tmp; } }
voidShellSort(int* a, int n) { //多组并排 int gap = n; while (gap > 1) { gap = gap / 2; //gap = gap / 3 + 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; } } }
voidSwap(int* a, int* b) { int tmp = *a; *a = *b; *b = tmp; } //直接选择排序 voidSelectSort(int* a, int n) { int begin = 0, end = n-1; while(end > begin) { int mini = begin, maxi = end; for (int i = begin+1; i <= end ; i++) { if (a[i] > a[maxi]) { maxi = i; } if (a[i] < a[mini]) { mini = i; } } Swap(&a[mini], &a[begin]); if (maxi == begin) { maxi = mini; } Swap(&a[maxi], &a[end]); begin++; end--; } }
intPartSort3(int* a, int left, int right) { int keyi = left; int prev = left; int cur = left + 1; while (cur <= right) { if (a[cur] < a[keyi]) { Swap(&a[cur], &a[prev]); } cur++; } Swap(&a[prev], &a[keyi]); return keyi; }
voidMergeSortNonr(int* a, int n) { int* tmp = (int*)malloc(sizeof(int) * n); if (tmp==NULL) { perror("malloc error\n"); return ; } int gap = 1; while (gap < n) { for (int i = 0; i < n; i += 2 * gap) { //[begin1, end1] [begin2, end2] int begin1 = i, end1 = gap + i - 1; int begin2 = i + gap, end2 = 2 * gap + i - 1; //printf("[%d,%d][%d,%d]", begin1, end1, begin2, end2);
if (begin2 > n) { break; } if (end2 > n) { end2 = n - 1; }
int index = i; while (begin1 <= end1 && begin2 <= end2) //有一个结束就结束 { if (a[begin1] < a[begin2]) { tmp[index++] = a[begin1++];
voidCountSort(int* a, int n) { //找出最大的和最小的 int max = a[0], min = 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* count = (int*)malloc(sizeof(int) * range); //将空间内数据初始化为0 memset(count, 0, sizeof(int) * range); //统计数据出现的次数 for (int i = 0; i < n; i++) { count[a[i] - min]++; } //排序(回写) int j = 0; for (int i = 0; i < range; i++) { while (count[i]--) { a[j++] = i + min; } } }