排序算法整理(第十五周实践项目)

本文详细介绍了几种常见的排序算法,包括直接插入排序、折半插入排序、冒泡排序、改进的冒泡排序以及选择排序,并提供了每种算法的实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接插入排序

#include <stdio.h>
#define MaxSize 20
typedef int KeyType;    //定义关键字类型
typedef char InfoType[10];
typedef struct          //记录类型
{
    KeyType key;        //关键字项
    InfoType data;      //其他数据项,类型为InfoType
} RecType;              //排序的记录类型定义

void InsertSort(RecType R[],int n) //对R[0..n-1]按递增有序进行直接插入排序
{
    int i,j;
    RecType tmp;
    for (i=1; i<n; i++)
    {
        tmp=R[i];
        j=i-1;            //从右向左在有序区R[0..i-1]中找R[i]的插入位置
        while (j>=0 && tmp.key<R[j].key)
        {
            R[j+1]=R[j]; //将关键字大于R[i].key的记录后移
            j--;
        }
        R[j+1]=tmp;      //在j+1处插入R[i]
    }
}
折半插入排序(二分排序)

#include <stdio.h>
#define MaxSize 20
typedef int KeyType;    //定义关键字类型
typedef char InfoType[10];
typedef struct          //记录类型
{
    KeyType key;        //关键字项
    InfoType data;      //其他数据项,类型为InfoType
} RecType;              //排序的记录类型定义

void InsertSort1(RecType R[],int n) //对R[0..n-1]按递增有序进行直接插入排序
{
    int i,j,low,high,mid;
    RecType tmp;
    for (i=1; i<n; i++)
    {
        tmp=R[i];
        low=0;
        high=i-1;
        while (low<=high)
        {
            mid=(low+high)/2;
            if (tmp.key<R[mid].key)
                high=mid-1;
            else
                low=mid+1;
        }
        for (j=i-1; j>=high+1; j--)
            R[j+1]=R[j];
        R[high+1]=tmp;
    }
}
int main()
{
    int i,n=10;
    RecType R[MaxSize];
    KeyType a[]= {9,8,7,6,5,4,3,2,1,0};
    for (i=0; i<n; i++)
        R[i].key=a[i];
    printf("排序前:");
    for (i=0; i<n; i++)
        printf("%d ",R[i].key);
    printf("\n");
    InsertSort1(R,n);
    printf("排序后:");
    for (i=0; i<n; i++)
        printf("%d ",R[i].key);
    printf("\n");
    return 0;
}

for(int i=0;i<10;++i)
    {
        int tmp=a[i];
        int low=0;
        int hight=i-1;
        while(low<=hight)
        {
             mid=(low+hight)/2;
            if(a[mid]<tmp)
                low=mid+1;
            else
                hight=mid-1;
        }
        //
        for(int k=i-1;k>=low;--k)
            a[k+1]=a[k];
        a[low]=tmp;
        for(int i=0;i<10;++i)
        printf("%d ",a[i]);
        printf(" :%d %d %d\n",low,hight,mid);//每层while循环结束时low=height+1;
	//最后的赋值语句也可以这样:
	//for(int k=i-1;k>=height+1;--k)
	//	a[k+1]=a[k];
	//a[height+1]=tmp;
}
冒泡排序:
void BubbleSort(RecType R[],int n)
{
    int i,j,k;
    RecType tmp;
    for (i=0; i<n-1; i++)
    {
        for (j=n-1; j>i; j--)   //比较,找出本趟最小关键字的记录
            if (R[j].key<R[j-1].key)
            {
                tmp=R[j];  //R[j]与R[j-1]进行交换,将最小关键字记录前移
                R[j]=R[j-1];
                R[j-1]=tmp;
            }
        printf("i=%d: ",i);
        for (k=0; k<n; k++)
            printf("%d ",R[k].key);
        printf("\n");
    }
}
//哈哈,贺老改进的冒泡排序:
void BubbleSort1(RecType R[],int n)
{
    int i,j,k,exchange;
    RecType tmp;
    for (i=0; i<n-1; i++)
    {
        exchange=0;
        for (j=n-1; j>i; j--)   //比较,找出最小关键字的记录
            if (R[j].key<R[j-1].key)
            {
                tmp=R[j];  //R[j]与R[j-1]进行交换,将最小关键字记录前移
                R[j]=R[j-1];
                R[j-1]=tmp;
                exchange=1;
            }
        printf("i=%d: ",i);
        for (k=0; k<n; k++)
            printf("%d ",R[k].key);
        printf("\n");

        if (exchange==0)    //中途结束算法
            return;
    }
}
选择排序:
void SelectSort(RecType R[],int n)
{
    int i,j,k,l;
    RecType temp;
    for (i=0; i<n-1; i++)           //做第i趟排序
    {
        k=i;
        for (j=i+1; j<n; j++)   //在当前无序区R[i..n-1]中选key最小的R[k]
            if (R[j].key<R[k].key)
                k=j;            //k记下目前找到的最小关键字所在的位置
        if (k!=i)               //交换R[i]和R[k]
        {
            temp=R[i];
            R[i]=R[k];
            R[k]=temp;
        }
        printf("i=%d: ",i);
        for (l=0; l<n; l++)
            printf("%d ",R[l].key);
        printf("\n");
    }
}






                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值