Sort.c
//交换
void Swap(int* a, int* b){
int tmp = 0;
tmp = *a;
*a = *b;
*b = tmp;
}
//插入排序
void InsertSort(int* a, int n){
assert(a);
for (int i = 0; i < n - 1; i++)
{
int end = i;
int tmp = a[end + 1];
while (end >= 0 && a[end] > tmp)
{
a[end + 1] = a[end];
end--;
}
a[end + 1] = tmp;
}
printf("\n");
}
//冒泡排序
void BubbleSort(int* a, int n){
int i = 0;
int j = 0;
int flag = 0;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - i - 1; j++)
{
if (a[j] > a[j + 1])
{
Swap(&a[j], &a[j + 1]);
flag = 1;
}
}
if (0 == flag)
{
break;
}
}
}
//向下调整
void ShiftDown(int* a, int n, int root){
int parent = root;
int child = parent * 2 + 1;
while (child < n)
{
if ((child+1 < n) && a[child + 1] > a[child])
{
child++;
}
if (a[parent] < a[child])
{
Swap(&a[parent], &a[child]);
parent = child;
child = parent * 2 + 1;
}
else
{
break;
}
}
}
//堆排序
void HeapSort(int* a,int n){
int root = (n - 2) / 2;
for (; root >= 0; root--)
{
ShiftDown(a, n, root);
}
while (n>0)
{
n--;
Swap(&a[0], &a[n]);
ShiftDown(a, n, 0);
}
}
//打印数组
void PrintArray(int* a,int n){
for (int i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
}
//希尔排序
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 && a[end] > tmp)
{
a[end + gap] = a[end];
end -= gap;
}
a[end + gap] = tmp;
}
}
printf("\n");
}
//选择排序
void SelectSort(int* a, int n){
int begin = 0;
int end = n - 1;
while (begin < end)
{
int max = begin;
int min = begin;
for (int i = begin; i <= end; i++)
{
if (a[i] > a[max])
{
max = i;
}
else if (a[i] <= a[min])
{
min = i;
}
}
Swap(&a[min], &a[begin]);
if (max == begin)
{
max = min;
}
Swap(&a[max], &a[end]);
end--;
begin++;
}
}
//三数取中交换
void GetMidSwap(int* a,int left, int right){
int mid = left + (right - left) / 2;
if (a[left] > a[mid])
{
if (a[left] <= a[right])
{
return;
}
else if (a[mid] >= a[right])
{
Swap(&a[mid], &a[left]);
}
else
{
Swap(&a[right], &a[left]);
}
}
else
{
if (a[mid] <= a[right])
{
Swap(&a[mid], &a[left]);
}
else if (a[left] >= a[right])
{
return;
}
else
{
Swap(&a[left], &a[right]);
}
}
}
//部分快排
int PartSort(int* a, int left,int right){
assert(a);
GetMidSwap(a, left, right);
int begin = left;
int tmp = a[left];
while (left < right)
{
while (left<right && a[right] >= tmp)
{
--right;
}
while (left<right && a[left] <= tmp)
{
++left;
}
Swap(&a[left], &a[right]);
}
Swap(&a[left], &a[begin]);
return left;
}
int PartSort2(int* a, int left, int right){
assert(a);
GetMidSwap(a, left, right);
int key = a[left];
while (left < right)
{
while (left < right && a[right] >= key)
{
right--;
}
a[left] = a[right];
while (left < right && a[left] <= key)
{
left++;
}
a[right] = a[left];
}
a[left] = key;
return left;
}
int PartSort3(int* a, int left, int right){
int key = a[left];
int prev = left;
int cur = left + 1;
while (cur <= right)
{
if (a[cur] < key && ++prev < cur)
{
Swap(&a[prev], &a[cur]);
}
++cur;
}
Swap(&a[prev], &a[left]);
return prev;
}
//快排
void QuikSort(int* a, int left,int right){
assert(a);
if (left >= right)
{
return;
}
else if (right - left < 5)
{
InsertSort(a + left, right - left + 1);
}
else
{
int mid = PartSort3(a, left, right);
QuikSort(a, left, mid - 1);
QuikSort(a, mid + 1, right);
}
}
//非递归快排
void QuikSortNor(int* a, int n){
Stack st;
StackInit(&st);
int left = 0;
int right = n - 1;
int mid = 0;
StackPush(&st, right);
StackPush(&st, left);
while (StackEmpty(&st) == 1)
{
left = StackTop(&st);
StackPop(&st);
right = StackTop(&st);
StackPop(&st);
mid = PartSort(a, left, right);
if (mid - left > 1)
{
StackPush(&st, mid - 1);
StackPush(&st, left);
}
if (right - mid > 1)
{
StackPush(&st, right);
StackPush(&st, mid + 1);
}
}
}
//部分归并排序
void _MergeSort(int* a, int left, int right, int* tmp){
//划分
if (left >= right)
{
return;
}
int mid = left + (right - left) / 2;
_MergeSort(a, left, mid,tmp);
_MergeSort(a, mid + 1, right,tmp);
//归并
int begin1 = left;
int end1 = mid;
int begin2 = mid + 1;
int end2 = right;
int flag = left;
while (begin1 <= end1 && begin2 <= end2)
{
if (a[begin1] <= a[begin2])
{
tmp[flag++] = a[begin1++];
}
else
{
tmp[flag++] = a[begin2++];
}
}
while (begin1 <= end1)
{
tmp[flag++] = a[begin1++];
}
while (begin2 < end2)
{
tmp[flag++] = a[begin2++];
}
memcpy(a + left, tmp + left, sizeof(int)*(right - left + 1));
}
//归并排序
void MergeSort(int* a, int n){
int* tmp = (int*)malloc(sizeof(int) * n);
_MergeSort(a, 0, n-1, tmp);
free(tmp);
}
//计数排序
void CountSort(int* a, int n)
{
int max = a[0];
int 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* countArr = (int*)malloc(sizeof(int)*range);
memset(countArr, 0, range * sizeof(int)); //20, 17, 4, 16, 5, 3
//计数
for (int i = 0; i < n; ++i)
{
countArr[a[i] - min]++;
}
//依次赋值
int j = 0;
for (int i = 0; i < range; ++i)
{
while (countArr[i]--)
{
a[j++] = i + min;
}
}
}