排序小结--希尔排序--快排--堆排序--归并排序


数据结构刚上了排序,写了各种排序的模板,分享下这一下午的劳动成果。

tips:第一次在程序运行时还输出了汉字!

#include "stdio.h"
#include "string.h"

#define N 10005

void Swap(int *x,int *y)  //交换
{
    int t;
    t = *x;
    *x = *y;
    *y = t;
}

void Shell_sort_in_k(int *a,int n,int dk) //对顺序表a进行一趟增量为dk的Shell排序,dk为步长因子
{
    int i,j,k;
    for(i=1; i<=dk; ++i)  //当前有dk个子序列,共插入排序dk次
    {
        for(j=i+dk; j<=n; j+=dk)  //对每一个子序列进行插入排序
        {
            a[0] = a[j];  //当前要插入的元素为a[j];
            for(k=j-dk; k>0&&a[0]=r) return ;
    int start = l;
    int end = r;
    while(l=temp)
            --r;
        if(l= a[j]) break;
        a[start] = a[j];
        start = j;
    }
    a[start] = temp;  //将temp插入到s位置上
}

void Heap_sort(int *a,int n)  //堆排序
{
    int i;
    for(i=n/2; i>0; i--)
        Heap_sort_k(a,i,n);  //将a[1]~a[n]建成大根堆
    for(i=n; i>1; i--)
    {
        Swap(&a[1],&a[i]);   //将堆顶记录与当前未排序的子序列a[]中最后一个记录相互交换
        Heap_sort_k(a,1,i-1);  //将a[1..i-1]重新调整为大根堆
    }
}

int c[N];  // 辅助空间

void Merge(int *a,int start,int mid,int end)  //将a[start~mid]与a[mid+1~end]合并;
{
    int m,n;
    int i,j,k;
    i = start; m = mid;
    j = mid+1; n = end;
    k = 0;
    for( ; i<=m && j<=n; ++k)  //将两段区间由小到大并入c[];
    {
        if(a[i]


你可能感兴趣的:(数据结构)