剩余三种排序方式: 堆排序, 归并排序, 基数排序 以及各种排序方式的特点, 何时运用哪一种排序方式。
六 堆排序
#include <stdio.h>
void AdjustMinHeap(int *a, int pos, int len)
{
int temp;
int child;
for (temp = a[pos]; 2 * pos + 1 <= len; pos = child)
{
child = 2 * pos + 1;
if (child < len && a[child] > a[child + 1])
{
child++;
}
if (a[child] < temp)
{
a[pos] = a[child];
}
else
{
break;
}
}
a[pos] = temp;
}
void Swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void PrintArray(int *a, int length)
{
int i;
for (i = 0; i < length; i++)
{
printf("%d ", a[i]);
}
printf("\n");
}
void HeapSort(int *array, int len)
{
int i;
for (i = len / 2 - 1; i >= 0; i--)
{
AdjustMinHeap(array, i, len - 1);
}
for (i = len -1; i >= 0; i--)
{
Swap(&array[0], &array[i]);
AdjustMinHeap(array, 0, i - 1);
}
}
int main()
{
int array[] = {0, 13, 1, 14, 27, 18};
int length = sizeof(array) / sizeof(array[0]);
HeapSort(array, length);
PrintArray(array, length);
return 0;
}
七 归并排序
#include <stdio.h>
#include <stdlib.h>
void Merge(int array[], int start, int middle, int end)
{
int i, j, k, n1, n2;
n1 = middle - start + 1;
n2 = end - middle;
int *L = (int *)malloc(n1 * sizeof(int));
int *R = (int *)malloc(n2 * sizeof(int));
for (i = 0, k = start; i < n1; i++, k++)
{
L[i] = array[k];
}
for (i = 0, k = middle + 1; i < n2; i++, k++)
{
R[i] = array[k];
}
for (k = start, i = 0, j = 0; i < n1 && j < n2; k++)
{
if (L[i] < R[j])
{
array[k] = L[i];
i++;
}
else
{
array[k] = R[j];
j++;
}
}
if (i < n1)
{
for (j = i; j < n1; j++, k++)
{
array[k] = L[j];
}
}
if (j < n2)
{
for (i = j; i < n2; i++, k++)
{
array[k] = R[i];
}
}
}
void MergeSort(int array[], int start, int end)
{
int middle;
int i;
if (start < end)
{
middle = (start + end) / 2;
MergeSort(array, start, middle);
MergeSort(array, middle + 1, end);
Merge(array, start, middle, end);
}
}
int main()
{
int i = 0;
int a[] = {49, 38, 65, 97, 76, 13, 27};
int length = sizeof(a) / sizeof(a[0]);
MergeSort(a, 0, length -1);
for (i = 0 ; i < length; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
八 基数排序
#include <stdio.h>
int Getmax(int *a, int n)
{
int i, max;
max = a[0];
for(i = 0; i < n; i++)
{
if(max < a[i])
{
max = a[i];
}
}
return max;
}
int countsort(int *a,int n, int exp)
{
int output[n];
int buckets[10] = {0};
int i;
printf("*5*\n");
for(i = 0; i < n; i++)
{
buckets[(a[i] / exp) % 10]++;
}
printf("*4*\n");
for(i = 1; i < n; i++)
{
buckets[i] += buckets[i - 1];
}
printf("*3*\n");
for(i = n - 1; i >= 0; i--)
{
output[buckets[(a[i] / exp) % 10] - 1] = a[i];
buckets[(a[i] / exp) % 10]--;
}
printf("*2*\n");
for(i = 0; i < n; i++)
{
a[i] = output[i];
}
return 1;
}
int Radixsort(int *a, int n)
{
int exp;
int max = Getmax(a, n);
printf("*1*\n");
for(exp = 1; (max / exp) > 0; exp *= 10 )
{
countsort(a,n,exp);
}
return 1;
}
int main()
{
int i;
int a[] = {278, 109, 63, 930, 589, 184, 505, 269, 8, 83};
int len = sizeof(a) / sizeof(a[0]);
Radixsort(a, len);
for(i = 0; i < len; i++)
{
printf("%d ", a[i]);
}
return 0;
}