// 冒泡排序 voidBubbleSort(int* a, int n) { int i = 0; int j = 0; for (i = 0; i < n; i++) { int exchange = 0;//加一个判断条件,比如:如果第x趟是有序的直接结束掉循环,return掉 for (j = 0; j < n - i - 1; j++) { if (a[j] > a[j + 1]) { SwapData(&a[j], &a[j + 1]); exchange = 1;//有交换的话置为1 } } if (!exchange)//没有交换就返回 { return; } } }
🏍️插入排序
什么是插入排序
个人理解插入排序类似于打牌
幸运女神在微笑,胜利女神在微笑
🎉插入排序代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
voidInsertSort(int* a, int n)//想象自己在打扑克 { int i = 0; for (i = 0; i < n - 1; i++)//先是第一个和第二个开始比较 { int end = i;//end是下标 int tmp = a[end + 1]; while (end >= 0 && tmp < a[end]) { a[end + 1] = a[end]; end--; } a[end + 1] = tmp;//用3 1 2 作为测试用例就可以理解为什么是a[end+1]=tmp } }
// 希尔排序 voidShellSort(int* a, int n) { int gap = n;//n=2的时候代入一下 while (gap > 1)//gap=1的时候已经执行一次代码了,然后再判断的。 { gap = gap / 3 + 1; int i = 0; for (i = 0; i < n - gap; i++) { int end = i; int tmp = a[end + gap]; while (end >= 0 && a[end] > tmp) { a[end + gap] = a[end]; end-=gap;//记得这里是end-=gap 不是 end--!!!这是希尔排序!!! } a[end + gap] = tmp; } } }
intPartSort3(int* a, int left, int right) { int midi = GetMidi(a, left, right); SwapData(&a[left], &a[midi]);
int keyi = left; int cur = left; int pro = left + 1;//pro 先走 while (pro<=right) { if (a[pro] < a[keyi] && a[++cur] != a[pro]) { SwapData(&a[pro], &a[cur]); } pro++; } SwapData(&a[keyi],& a[cur]);
return cur; } voidQuickSort(int* a, int left, int right) { if (left >= right) { return; }
if (right - left + 1 < 5) { InsertSort(a+left, right - left + 1); } else { int midi = PartSort3(a, left, right); QuickSort(a, left, midi - 1); QuickSort(a, midi + 1, right); } }
voidQuickSortNonR(int* a, int left, int right) { ST st; StackInit(&st); if (left < right)//先进后出 { StackPush(&st, left); StackPush(&st, right); } while (!StackEmpty(&st)) { right = StackTop(&st); StackPop(&st); left = StackTop(&st); StackPop(&st); int midi=PartSort3(a, left, right);
void _MergeSort(int* a, int begin, int end,int* tmp)//先分成最小规模子问题然后再解决 { if (begin >= end) { return; } int midi = begin + ((end-begin)>>1); _MergeSort(a, begin, midi, tmp); _MergeSort(a, midi+1, end, tmp);
int begin1 = begin; int end1 = midi; int begin2 = midi + 1; int end2 = end; int index = begin;//合并两个有序数组
voidMergeSortNonR(int* a, int n) { int* tmp = (int*)malloc(sizeof(int) * n); assert(tmp); int gap = 1; while (gap<n) { int i = 0; for (i = 0; i < n; i += 2*gap) { int begin1 = i; int end1 = i + gap - 1; int begin2 = i + gap; int end2 = i + 2 * gap - 1; if (end1 >= n) { end1 = n - 1; } if (begin2 >= n) { begin2 = n; end2 = n - 1; } if (begin2<n && end2 >= n) { end2 = n - 1; } int index = i; while (begin1<=end1 && begin2<=end2) { if (a[begin1] <= a[begin2]) { tmp[index++] = a[begin1++]; } else { tmp[index++] = a[begin2++]; } } while (begin1<=end1) { tmp[index++]=a[begin1++]; } while (begin2<=end2) { tmp[index++] = a[begin2++]; } } assert(tmp); memcpy(a, tmp, n * sizeof(int)); gap *= 2; } free(tmp); }
voidCountSort(int* a, int n) { int max = a[0]; int min = a[0]; int i = 0; for (i = 0; i < n; i++) { if (a[i] < min) { min = a[i]; } if (a[i] > max) { max = a[i]; } } int range = (max - min + 1); int* tmp = (int*)malloc(sizeof(int)*range); assert(tmp); memset(tmp, 0, sizeof(int) * range);//把tmp数组初始化为0 int j = 0; int count = 0;//最后把tmp中的值赋给a,控制a的下标 for (i = 0; i < n; i++) { tmp[a[i] - min]++; } for (i = 0; i < range; i++) { for (j = 0; j < tmp[i]; j++) { //a[count++] = (tmp[j] + min);这是错误写法 //a[count++] = (tmp[i] + min); 这是错误写法 a[count++] = i + min;//下标+min才是原来的数字 } } }