堆排序(二叉树模型)
#include <stdio.h>
// 交换函数
void swap (int a[], int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
// 打印数组
void printA (int *a, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf ("%4d", a[i]);
}
printf ("\n");
}
void heapify(int *a , int i, int len)
{
int max = i;
int left = 2 * i + 1;
int right = 2 * i + 2;
if(left < len && a[left] > a[max])
max = left;
if(right < len && a[right] > a[max])
max = right;
if(max != i)
{
swap (a, max, i);
heapify(a, max, len);
}
}
void heapsort(int *a, int len)
{
int i;
for (i = len/2-1; i > 0; i--)
{
heapify(a , i ,len);
}
//排序
for (i = len - 1;i >= 0; i--)
{
swap(a , 0, i); //堆顶元素和堆尾元素交换
len--;
heapify(a , 0, len); //调整堆顶
}
}
int main()
{
int a[10] = {9,6,8,0,3,5,2,4,7,1};
int len = sizeof(a) / sizeof(a[0]);
heapsort (a, len);
printA (a, len);
return 0;
}
归并排序
#include <stdio.h>
// 打印数组
void printA (int *a, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf ("%4d", a[i]);
}
printf ("\n");
}
//归并
void merge(int *a, int left, int mid, int right, int *tmp)
{
int i = left;
int j = mid + 1;
int k = 0;
while(i <= mid && j <= right)
{
if(a[i] > a[j])
{
tmp[k++] = a[j++];
}
else
{
tmp[k++] = a[i++];
}
}
while(i <= mid)
{
tmp[k++] = a[i++];
}
while(j <= right)
{
tmp[k++] = a[j++];
}
k = 0;
for(i = left; i <= right; i++)
{
a[i] = tmp[k++];
}
}
void mergesort(int *a, int left, int right, int *tmp)
{
if(left >= right)
return;
int mid = (left + right)/2;
mergesort(a, left, mid ,tmp);
mergesort(a, mid+1,right,tmp);
merge(a, left, mid, right, tmp);
}
int main()
{
int a[10] = {9,6,8,0,3,1,2,4,7,5};
int len = sizeof(a) / sizeof(a[0]);
int tmp[10];
mergesort (a, 0, len-1, tmp);
printA (a, len);
return 0;
}
快速排序
#include <stdio.h>
// 交换函数
void swap (int a[], int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
// 打印数组
void printA (int *a, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf ("%4d", a[i]);
}
printf ("\n");
}
int partition(int *a, int left, int right)
{
int num = a[right]; //num为基准值也就是最右边的数
int index = left;
int i;
for (i = left; i < right; i++)
{
if (a[i] < num)
{
swap (a , index, i);
index++;
}
printA (a, 10);
}
swap (a , index, right); //.
return index; //基准值的下标 //基准值左边的数比基准值小 右边的数比基准值大
}
//排序
void qsort (int *a, int left, int right)
{
if (left < right)
{
int index = partition(a, left, right); //获取基准值的下标
qsort (a, left, index - 1); //对基准值左边进行快速排序 //所以这边index下标的元素就不用排序了
qsort (a, index + 1, right); //队基准值右边进行快速排序
}
}
int main()
{
int a[10] = {9,6,8,0,3,1,2,4,7,5};
int len = sizeof(a) / sizeof(a[0]);
qsort (a , 0 , len - 1);
printA (a, 10);
return 0;
}