本篇我们复习一下前面我们学习过的排序类型,为后面的学习做些准备。毕竟温故而知新,可以为师矣。
- void InsertSort(int* a, int n)
- {
- for (int i = 0;i < n - 1;++i)
- {
- int end = i;
- int tmp = a[end + 1];
- while (end >= 0)
- {
- if (tmp < a[end])
- {
- a[end + 1] = a[end];
- --end;
- }
- else
- {
- break;
- }
- }
- a[end + 1] = tmp;
- }
- }
- void ShellSort(int* a, int n)
- {
- int gap = n;
- while (gap > 1)
- {
- gap = gap / 3 + 1;
- for (int i = 0;i < n - gap;++i)
- {
- int end = i;
- int tmp = a[end + gap];
- while (end >= 0)
- {
- if (tmp < a[end])
- {
- a[end + gap] = a[end];
- end-=gap;
- }
- else
- {
- break;
- }
- }
- a[end + gap] = tmp;
- }
- }
- }
直接插入排序就是gap为1的希尔排序。
- void SelectSort(int* a, int n)
- {
- int begin = 0;
- int end = n - 1;
- while (begin < end)
- {
- int min = begin;
- int max = begin;
- for (int i = begin + 1;i <= end;++i)
- {
- if (a[i] < a[min])
- {
- min = i;
- }
- if (a[i] > a[max])
- {
- max = i;
- }
- }
- Swap(&a[begin], &a[min]);
- if (max==begin)//当最大的数字下标为begin,必须让max=min
- {
- max = min;
- }
- Swap(&a[end], &a[max]);
- ++begin;
- --end;
- }
- }
- void AdjustDown(int* a, int size, int parent)
- {
- int child = parent * 2 + 1;
- while (child < size)
- {
- if (child + 1 < size && a[child] > a[child + 1])
- {
- ++child;
- }
- if (a[child] < a[parent])
- {
- Swap(&a[child], &a[parent]);
- parent = child;
- child = child * 2 + 1;
- }
- else
- {
- break;
- }
- }
- }
- void HeapSort(int*a,int n)
- {
- for (int i = (n - 1 - 1) / 2;i >= 0;--i)
- {
- AdjustDown(a, n, i);
- }
-
- }
- void BubbleSort(int* a, int n)
- {
- for (int j = 0;j < n;j++)
- {
- for (int i = 0;i <=n - 1 - 1;i++)
- {
- if (a[i] > a[i + 1])
- {
- Swap(&a[i], &a[i + 1]);
- }
- }
- }
- }
- int GetMidi(int* a, int begin, int end)
- {
- int midi = (begin + end) / 2;
- // begin midi end 三个数选中位数
- if (a[begin] < a[midi])
- {
- if (a[midi] < a[end])
- return midi;
- else if (a[begin] > a[end])
- return begin;
- else
- return end;
- }
- else // a[begin] > a[midi]
- {
- if (a[midi] > a[end])
- return midi;
- else if (a[begin] < a[end])
- return begin;
- else
- return end;
- }
- }
- int PSort(int* a, int begin,int end)
- {
- int midi = GetMidi(a, begin, end);
- Swap(&a[midi], &a[begin]);
- int key = begin;
- int prev = begin;
- int cur = prev + 1;
- while (cur <= end)
- {
- if (a[cur] < a[key] && ++prev != cur)
- Swap(&a[cur], &a[prev]);
- ++cur;
- }
- Swap(&a[key], &a[prev]);
- key = prev;
- return key;
- }
- void QuickSort(int* a, int begin, int end)
- {
- if (begin >= end)
- return;
- int keyi = PSort(a, begin, end);
- QuickSort(a, begin, keyi - 1);
- QuickSort(a, keyi + 1, end);
- }
快速排序很少用到hoare的方法,都是用的挖坑法和前后指针法。