直接插入排序

#include<stdio.h>
#include<malloc.h>
/*
	直接插入排序即是在要排序的数组中,假设前n-1(n>=2)个数已经是排好序的,现在要把第n个数插入到前n个已经排好序的
	数组中,使得这n个数也变成有序的,如此反复循环,使得要排序的数组中的最后一个元素也排好序,
    我们可以先假设第一个数是排好序的,然后第二个数和第一个数进行比较,如果第二个数比第一个数大,
	那么说明前两个数排好序,无需做调整,如果第二个数比第一个数小,那么就把第一个数向后移,
	将第二个数放在第一个数的位置上,抽象出来就是用a[i]和a[i-1]进行比较,如果a[i]>a[i-1],
	那么就说明前i个数是已经排好序的,如果a[i]<a[i-1],就让j=i-1,temp=a[i],然后一边将数据a[j]向后移动,
	一边向前搜索,直到找到a[j]<a[i]时停止,并将temp放到a[j+1]处即可。
 具体代码实现如下:
 
//如下很类似与冒泡排序 但是我们说冒泡每次冒最大的到后面  直接插入则是每次交换到应该插入的位置 
void directSort(int * a,int len){
	int i,j,temp;
	for(i = 1; i < len;i++){
		temp = a[i]; 
		for(j = i-1;j >= 0;j--){
			if(a[j]<=temp)
				continue;
			else{
				a[i] = a[j];
				a[j] = temp;
				break;
			}
		}
	}

}

int main(){
	int i,j,n,e;
	int *a;
	printf("请输入元素的个数:");
	scanf("%d",&n);
	a = (int *)malloc(sizeof(int)*n);
	for(i = 0; i < n;i++){
		printf("请输入第 %d 个元素:",i+1);
		scanf("%d",&e);
		a[i] = e;
	}
	printf("待排序元素如下:");
	for(i = 0; i < n;i++){
		printf("%d ",a[i]);
	}
	printf("\n");
	//开始排序 
	directSort(a,n);
	printf("排序后元素如下:"); 
	for(i = 0; i < n;i++){
		printf("%d ",a[i]);
	}
	return 0;
} //我们说为了学习算法,主要是学习他的思想和实现 
*/
void print(int *a){
	int i;
	for(i = 0; i < 7;i++){
		printf("%d ",a[i]);
	}
	printf("%d\n",a[i]);
} 
int main(){
	int i,j,temp;//flag = 0 也可以使用标志 
	int a[8] = {95, 45, 15, 78, 84, 51, 24, 12};
	printf("原序列:");
	print(a);
	for (i = 1; i < 8; i++) { 
        if (a[i] < a[i - 1])
        {
            int temp = a[i];  
            for (j = i - 1; j >= 0 && a[j] > temp; j--)  
                a[j + 1] = a[j];  
            a[j + 1] = temp;  
        }
    
		printf("第 %d 趟排序:",i);
		print(a);
	} 
	printf("排序后元素如下:"); 
	print(a);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值