一、希尔排序
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 tmp = a[i + gap];
int j;
for (j = i; j >= 0; j -= gap)
{
if (tmp >= a[j])
break;
a[j + gap] = a[j];
}
a[j + gap] = tmp;
}
}
}
二、快速排序
int midIndex(int* a, int begin, int end)
{
int mid = (begin + end) >> 2;
if (a[begin] < a[mid])
{
if (a[mid] < a[end])
return mid;
else if (a[end] < a[begin])
return begin;
else
return end;
}
else
{
if (a[mid] > a[end])
return mid;
else if (a[begin] < a[end])
return begin;
else
return end;
}
}
void quickSort(int* a, int begin, int end)
{
if (begin >= end)
return;
int mid = midIndex(a, begin, end);
int key = begin;
Swap(&a[key], &a[mid]);
int left = begin, right = end;
while (left < right)
{
while (left < right && a[right] >= a[key])
right--;
while (left < right && a[left] <= a[key])
left++;
Swap(&a[left], &a[right]);
}
Swap(&a[key], &a[left]);
key = left;
quickSort(a, begin, key - 1);
quickSort(a, key + 1, end);
}
void quickSort(int* a, int begin, int end)
{
if (begin >= end)
return;
Stack stack;
initStack(&stack);
stackPush(&stack, begin);
stackPush(&stack, end);
while (!stackEmpty(&stack))
{
int right = stackTop(&stack);
stackPop(&stack);
int left = stackTop(&stack);
begin = left;
end = right;
stackPop(&stack);
int key = begin;
int mid = midIndex(a, begin, end);
Swap(&a[key], &a[mid]);
while (left < right)
{
while (left < right && a[right] >= a[key])
right--;
while (left < right && a[left] <= a[key])
left++;
Swap(&a[left], &a[right]);
}
Swap(&a[key], &a[left]);
if (end > left + 1)
{
stackPush(&stack, left + 1);
stackPush(&stack, end);
}
if (begin < left - 1)
{
stackPush(&stack, begin);
stackPush(&stack, left - 1);
}
}
}
三、归并排序
void mergeSort(int* a, int begin, int end)
{
if (begin >= end)
return;
int n = end - begin + 1;
int* tmp = (int*)malloc(n * sizeof (int));
if (tmp == NULL)
{
printf("mergeSort: malloc failed\n");
return;
}
int gap = 1;
while (gap < n)
{
for (int i = 0; i < n; i += 2 * gap)
{
if (i + gap >= n)
break;
int curL = i, curR = i + gap;
int endL = i + gap - 1, endR = i + 2 * gap - 1;
if (endR >= n)
endR = n - 1;
int j = i;
while (curL <= endL && curR <= endR)
{
if (a[curL] < a[curR])
tmp[j++] = a[curL++];
else
tmp[j++] = a[curR++];
}
while (curL <= endL)
{
tmp[j++] = a[curL++];
}
while (curR <= endR)
{
tmp[j++] = a[curR++];
}
for (j = i; j <= endR; j++)
{
a[j] = tmp[j];
}
}
gap *= 2;
}
free(tmp);
}