Chinaunix首页 | 论坛 | 博客
  • 博客访问: 610806
  • 博文数量: 262
  • 博客积分: 8433
  • 博客等级: 中将
  • 技术积分: 2141
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-31 09:37
文章分类

全部博文(262)

文章存档

2012年(1)

2011年(168)

2010年(92)

2009年(1)

分类: C/C++

2010-12-24 10:38:36

/*
 * sort.c
 *
 * Created on: 2010-12-22
 * Author: qiang
 */


#include <stdio.h>
#include <stdlib.h>

#define LENGTH 5

typedef int Status;
typedef int ElemType;

//直接插入排序

Status InsertSort(ElemType *r,int len)
{
    int i,j;        //无序列表i,有序列表j


    for(i=2;i<=len;i++)    //把第一个元素看成有序列,进行len-1次插入

    {
        if(r[i]<r[i-1])
        {
            r[0]=r[i];    //将a[i]复制为哨兵

            r[i]=r[i-1];    //后移,留出空位

            for(j=i-2;r[0]<r[j];j--)    //j=i-2,指向有序列最后一个元素

                r[j+1]=r[j];    //有序列后移,找出插入的位置

            r[j+1]=r[0];
        }
    }

    return 0;
}

//我的插入算法

Status myinsert(ElemType *r,int len)
{
    int i,j;

    for(i=2;i<=len;i++)
    {
        r[0]=r[i];
        if(r[0]<r[i-1])
        {
            r[i]=r[i-1];    //后移


            j=i-2;            //j指向有序列最后一个元素

            while(r[0]<r[j])
            {
                r[j+1]=r[j];//有序列后移

                j--;
            }
            r[j+1]=r[0];
        }
    }

    return 0;
}

//冒泡排序-大数下沉

Status BubbleSort(ElemType *r,int len)
{
    int i,j;
    ElemType tmp;
    for(i=0;i<len;i++)
        for(j=0;j<len-i;j++)
        {
            if(r[j]>r[j+1])
            {
                tmp=r[j];
                r[j]=r[j+1];
                r[j+1]=tmp;
            }
        }
    return 0;
}

//快速排序

int Partition(ElemType *r,int low,int high)
{
    ElemType pivotkey;
    r[0]=r[low];    //存放第一个元素到r[0]

    pivotkey=r[low];    //将第一个元素作为曲轴记录点


    while(low<high)
    {
        while(low<high&&r[high]>=pivotkey)
            high--;
        r[low]=r[high];    //交换位置


        while(low<high&&r[low]<=pivotkey)
            low++;
        r[high]=r[low];    //交换位置

    }

    r[low]=r[0];    //将保护的元素r[0]插入到合适的位置


    return low;        //返回曲轴位置

}

Status QSort(ElemType *r,int low,int high)
{
    int pivotloc;    //定义曲轴位置


    if(low<high)
    {
        pivotloc = Partition(r,low,high);
        QSort(r,low,pivotloc-1);    //对前段分区进行递归排序

        QSort(r,pivotloc+1,high);    //对后段分区进行递归排序

    }
    return 0;
}

//希尔插入排序

//前后记录的位置增量是k,而不是1;r[0]是暂存单元,而不是哨兵

Status ShellSort(ElemType *r,int len)
{
    int k;    //假定增量k

    for(k=len/2;k>0;k--)    //0
    {
        //一趟增量k插入法排序

        int i,j;
        for(i=k+1;i<=len;i++)  //注意范围
        {
            if(r[i]<r[i-k])
            {
                r[0]=r[i];    //将r[i]暂存到r[0]

                j=i-k;
                while(j>0&&r[0]<r[j])
                {
                    r[j+k]=r[j];
                    j-=k;
                }
                r[j+k]=r[0];
            }
        }

    } //end_for

    return 0;
}

int main()
{
    int i;
    ElemType a[LENGTH],r[LENGTH+1];
    r[0]=0;    //预留出r[0]哨兵位置

    printf("请输入5个排序的字符: \n");
    for(i=0;i<5;i++)
    {
        scanf("%d",&a[i]);
        r[i+1]=a[i];        //为插入法排序打下基础

    }

/*
    //插入法排序
    myinsert(r,LENGTH);
    printf("InsertSort result: \n");
    int j;
    for(j=1;j<=LENGTH;j++)
        printf("data: %d \n",r[j]);
*/

/*
    //冒泡法排序
    BubbleSort(a,LENGTH);
    printf("BubbleSort result: \n");
    int j;
    for(j=0;j        printf("data: %d \n",a[j]);
*/

/*
    //快速排序
    QSort(r,1,LENGTH);
    printf("QSort result: \n");
    int j;
    for(j=1;j<=LENGTH;j++)
        printf("data: %d \n",r[j]);
*/


    //Shell排序

    ShellSort(r,LENGTH+1);
    printf("ShellSort result: \n");
    int j;
    for(j=1;j<=LENGTH;j++)
        printf("data: %d \n",r[j]);

    return 0;



}


文件: sort.zip
大小: 26KB
下载: 下载
阅读(550) | 评论(0) | 转发(0) |
0

上一篇:经济书刊集锦

下一篇:哈希表的应用

给主人留下些什么吧!~~