c语言各种常见排序(直接插入排序、折半插入排序、冒泡排序、选择排序、堆排序)...


001#include <stdio.h>
002#include <stdlib.h>
003 int main()
004{
005 int L[11]={0,70,38,65,97,76,93,1,15,68,64}; //0不做排序只是当做哨兵,或者临时交换空间使用。
006 int i=0;
007 printf("未排序前序列:\n");
008 for(i=1;i<=10;i++)
009 {
010 printf("%d ",L[i]);
011 }
012 printf("\n-------------------------------------\n");
013 insertSort(L); //直接插入排序
014 //BInsertSort(L); //折半插入排序
015 //bubbleSort(L);//冒泡排序
016 //selectSort(L); //选择排序
017 //heapSort(L,10); //堆排序
018 printf("排序后序列:\n");
019 for(i=1;i<=10;i++)
020 {
021 printf("%d ",L[i]);
022 }
023 return 0;
024}
025 void insertSort(int L[11])//插入排序 插入排序的最差和平均情况的性能是O(n^2)
026{
027 int i=0,j=0;
028 for(i=2;i<=10;++i)
029 {
030 L[0]=L[i]; //监视哨
031 for(j=i-1;L[0]<L[j];--j)
032 {
033 L[j+1]=L[j]; //记录后移
034 }
035 L[j+1]=L[0];//插入记录
036 }
037}
038 void BInsertSort(int L[11]) //折半查找排序
039{
040 int i=0,j=0,low=0,high=0,m=0;
041 for(i=2;i<=10;++i)
042 {
043 L[0]=L[i]; //监视哨
044 low=1;high=i-1;
045 while(low<=high){
046 m=(low+high)/2; //折半
047 if(L[0]<L[m])
048 high=m-1;
049 else
050 low=m+1;
051 }
052 for(j=i-1;L[0]<L[j];--j)
053 L[j+1]=L[j]; //记录后移
054 L[high+1]=L[0]; //插入
055 }
056}
057 void bubbleSort(int L[11]) //冒泡排序复杂度是O(n^2)
058{
059 int i=0,j=0;
060 for(i=1;i<=10;++i)
061 {
062 for(j=1;j<=10-i;++j)
063 {
064 if(L[j]>L[j+1])
065 {
066 L[0]=L[j];
067 L[j]=L[j+1]; //用辅助空间交换两个值
068 L[j+1]=L[0];
069 }
070 }
071 }
072}
073 void selectSort(int L[11]) //选择排序 复杂度为:O(n^2)
074{
075 int i=0,j=0,min_idx=0;
076 for(i=1;i<=10;++i)
077 {
078 min_idx=i;
079 for(j=i+1;j<=10;++j)
080 {
081 if(L[j]<L[min_idx])
082 {
083 min_idx=j;
084 }
085 }
086 if(min_idx!=i)
087 {
088 L[0]=L[i];
089 L[i]=L[min_idx]; //交换最小值与L[i]
090 L[min_idx]=L[0];
091 }
092 }
093}
094 void heapSort(int L[11],int n) //堆排序
095{
096 int i=0;
097 for(i=n/2;i>0;--i)
098 heapAjust(L,i,n);
099 for(i=n;i>1;--i)
100 {
101 L[0]=L[1];
102 L[1]=L[i];
103 L[i]=L[0];
104 heapAjust(L,1,i-1);
105 }
106}
107 void heapAjust(int L[11],int s,int m) //建大顶堆,使L[s...m]为大顶堆
108{
109 int rc=L[s],i=0;
110 for(i=2*s;i<=m;i*=2)
111 {
112 if(i<m&&L[i]<L[i+1])
113 ++i;
114 if(rc>=L[i])
115 break;
116 L[s]=L[i];
117 s=i;
118 }
119 L[s]=rc;
120}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值