void ShellSort(int* a, int n) {
//每次与gap+该位置的比较
int gap = n;
while (gap > 1) {
gap = gap / 3 + 1;
//gap是按照Knuth提出的方式取值的
//当gap=1时,为插入排序
for (size_t 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;
}
}
}
void SelectSort(int* a, int n) {
int begin = 0;
int end = n - 1;
//首尾位置
while (begin < end) {
int mini = begin;//保留最大与最小值
int max = end;
for (int i = begin + 1; i <= end; i++) {
if (a[i] > a[max])
{
max = i;
}
if (a[i] < a[mini])
{
mini = i;
}
}
//避免当最大为首位置时,与最小交换,此时最大在mini位置
Swap(&a[begin], &a[mini]);
if (begin == max)
max = mini;
Swap(&a[end], &a[max]);
++begin;
--end;
}
}
//冒泡排序
void BubbleSort(int* a, int n)
{
for (int j = 0; j < n; j++) {
int flag = 0;
//减少排序次数,如果序列为有序序列,则直接跳出循环
for (int i = 0; i < n - j; i++) {
if (a[i - 1] > a[i]) {
Swap(&a[i - 1], &a[i]);
flag = 1;
}
}
//flag=0;说明为顺序
if (flag = 0) {
break;
}
}
}