2019.2.13没学别的,拿插入排序和选择排序凑数

第十一章看完了,课后题还没写(;´д`)ゞ
快开学了,不知道是不是应该把重心转移到别处?
十一章之后的东西不知道短时间内能不能用上。
今天又看了两个排序算法

直接插入排序

/*insertsort直接插入排序
 *每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;直到待排序数据元素全部插入完为止*/
#include<stdio.h>
void insertsort(int arr[],int n);
int main(void)
{
	int i,array[20]={21,25,49,25,16,8,9,1,4,22,8548,453,215,4452,21,12,5,4,20,453};
	insertsort(array,20);
	printf("\n* **\t* **\t* **\t* **\t* **\t* **\t* **\t* **\t* **\n");
	for(i=0;i<20;i++){
		printf("%d ",array[i]);
	}
	
	return 0;
}
void insertsort(int arr[],int n)//数组有n个元素 
{
	int i,j,temp;
	for(i=1;i<n;i++){
		temp=arr[i];//复制出元素arr[i],之前元素已经排好序 
		for(j=i;j>0&&temp<arr[j-1];j--){//将抽取的元素与之前的有序数列进行比较
		//若存在temp<arr[i]前的元素,arr[i]的位置空出 
			arr[j]=arr[j-1];//当temp小于比较项时,大于temp的部分后移一个单位,最终arr[j]空出 
		}//不写temp=<arr[j-1]可以减少循环,还保证了排序的稳定性o(*▽*)o 
		arr[j]=temp;//若arr[i]>之前所有元素,则跳出上面循环(还是运算了j=i) 
	}
	for(i=0;i<n;i++){
		printf("%d ",arr[i]);
	}
}

选择排序

/*选择排序——不稳定*/ 
/*给每个位置选择当前元素最小的,比如:
 *给第一个位置选择最小的,在剩余元素里面给第二个元素选择最小的,依次类推,直到第n-1个元素。
 *第n个元素不用选择了,因为只剩下它一个最大的元素了*/
#include<stdio.h>
void selectsort(int arr[],int n);
int main(void)
{
	int i,array[20]={21,25,49,25,16,8,9,1,4,22,8548,453,215,4452,21,12,5,4,20,453};
	for(i=0;i<20;i++){
		printf("%d ",array[i]);
	}
	printf("\n");
	for(i=0;i<10;i++)
		printf("**\t");
	printf("\n");
	selectsort(array,20);
	for(i=0;i<20;i++){
		printf("%d ",array[i]);
	}
	
	return 0;
}
void selectsort(int arr[],int n)
{
	int i,j,k,temp,min;
	for(i=0;i<n;i++){//当前在处理第i个元素
		min=arr[i];
		k=i;//别忘了这个语句,不然最后一轮会出岔子 
		for(j=i+1;j<n;j++){//min记录这一轮最小的数值,k为最小数值所在位置
			if(arr[j]<min){//
				min=arr[j];
				k=j;
			}
		}
		if(i!=k){//交换arr[i]与arr[k]的数值 
			temp=arr[k];
			arr[k]=arr[i];
			arr[i]=temp;
		}//可能使得原顺序被打乱,是不稳定的排序,例如:5 8 5 2 9 
	}
}

参考博客在此,不过总感觉在别的地方见过……
也许该到OJ上水题找找手感了……

2019年2月13日23点28分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值