排序算法(直接插入、折半插入、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序

int i,j;
for(i=2;i<=n;i++)    //数组下标从2开始,s[0]做监视哨,s[1]一个数据无可比性
{
    s[0]=s[i];    //给监视哨陚值
    j=i-1;    //确定要比较元素的最右边位黄
    while(s[0]<s[j])
    {
        s[j+1]=s[j];    //数据右移
        j--;    //产移向左边一个未比较的数
    }
    s[j+1]=s[0];    //在确定的位置插入s[i]
}
return 0;

}
int main()
{
int a[11],i; //定义数组及变量为基木整甩
printf(“请输入10个数据:\n”);
for (i =1;i<=10;i++)
scanf(“%d”,&a[i]); //接收从键盘输入的10个数据到数组a中
printf(“原始顺序:\n”);
for(i=1;i<11;i++)
printf(“%5d”,a[i]); //将未排序前的顺序输出
insort(a,10); //调用自定义函数 insort()
printf(“\n 插入数据排序后顺序:\n”);
for(i=1;i<11;i++)
printf(“%5d”,a[i]); //将排序后的数组输出
printf(“\n”);
return 0;
}


       运行结果:



请输入10个数据:
25 12 36 45 2 9 39 22 98 37
原始顺序:
25 12 36 45 2 9 39 22 98 37
插入数据排序后顺序:
2 9 12 22 25 36 37 39 45 98


####        2.折半插入排序


**(1)基本思想**


       折半插入排序的基本思想和直接插入排序类似,区别是查找插入位置的方法不同,折半插入排序是采用折半查找法来查找插入位置的。


        **(2)算法描述**  


       举一趟排序为例: 


       现在序列为13  38  49  65  76  97       27 49


       将要插入27,此时序列在数组中的情况为:




|  |  |  |
| --- | --- | --- |
|  |                             已经排序 |          未排序 |
| 关键字 | 13 | 38 | 49 | 65 | 76 | 97 | 27 | 49 |
| 数组下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |


       ①low = 0,high = 5,m = (0+5)/2 = 2(向下取整),下标为2的关键字为49,27 < 49,所以27应该插入到49的低半区,改变high = m-1=1,low仍然为0。


       ②low = 0,high = 1,m = (0+1)/2 = 0(向下取整),下标为0的关键字为13,27 > 13,所以27应该插入到13的高半区,改变low = m+1=1,high仍然为1。


       ③low = 1,high = 1,m = (1+1)/2 = 1(向下取整),下标为1的关键字为38,27 < 38,所以27应该插入到38的低半区,改变high = m-1=0,low仍然为1。此时low > high,折半查找结束,27的插入位置为下标为high的关键字之后,即13之后。


       ④依次向后移动关键字97,76,65,49,38,然后将27插入,这一趟折半插入排序结束。执行完这一趟排序结果为:


13  27  38  49  65  76  97        49


        **(3)代码实现**



//折半插入排序算——C语言实现
#include <stdio.h>
void print(int a[], int n ,int i){
printf(“%d:”,i);
for(int j=0; j<n; j++){
printf(“%d”,a[j]);
}
printf(“\n”);
}
void BInsertSort(int a[],int size){
int i,j,low = 0,high = 0,mid;
int temp = 0;
for (i=1; i<size; i++) {
low=0;
high=i-1;
temp=a[i];
//采用折半查找法判断插入位置,最终变量 low 表示插入位置
while (low<=high) {
mid=(low+high)/2;
if (a[mid]>temp) {
high=mid-1;
}else{
low=mid+1;
}
}
//有序表中插入位置后的元素统一后移
for (j=i; j>low; j–) {
a[j]=a[j-1];
}
a[low]=temp;//插入元素
print(a, 8, i);
}

}
int main(){
int a[8] = {3,1,7,5,2,4,9,6};
BInsertSort(a, 8);
return 0;
}


        运行结果:



1:13752496
2:13752496
3:13572496
4:12357496
5:12345796
6:12345796
7:12345679


####        3.希尔排序


**(1)基本思想**




![](https://img-blog.csdnimg.cn/20190816121751114.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hqdHVzZTEyMw==,size_16,color_FFFFFF,t_70)

 希尔排序演示 
 


       希尔排序又叫**缩小增量**排序,其本质还是插入排序,只不过将待排序列按某种规则分为几个子序列,分别对这几个子序列进行直接插入排序。这个规则的体现就是**增量**的选取,将待排序数组按照增量进行分组,然后将每组的元素利用直接插入排序的方法进行排序;每次再将增量折半减小,循环上述操作;当增量等于1时,利用直接插入,完成排序。


       可以看到增量的选择是希尔排序的重要部分。只要最终增量为1任何步长序列都可以工作。一般来
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值