5.1 基于循环的三基本排序:冒泡、简单选择、直接插入

差别和异同

相同:对于数组类型,这三种排序都是用二重循环去实现的

具体思路:

冒泡:第i次循环,把第i大的数甩到数组末尾

简单选择:第i循环,把第i小的数和下标i的元素交换

直接插入:第i次循环,前面i个数都有序

稳定性差别:

在常见的排序算法里,有五种是不稳定的(不稳定:排序前是 1,1 排序后虽然还是1,1,但是第二个1原先在第一个位置上)

简单选择不稳定,快堆折归(快排、堆排、折半插入、归并排序),后四种的速度都是nlogn,可以认为牺牲了稳定度去换取了速度。但简单选择的不稳定纯粹是因为太简单了,他的时间复杂度是n^2。

代码


int* simpleSort(int* data ,int size)  //简单选择
{
	//防空
	if(NULL == data )
		return NULL;
	//一次选出一个最小
	int minPos=0;
	int minVal=0;
	int i = 0;
	int j = 0;
	int temp=0;
	for(i;i<size;i++){
		for(j=i;j<size;j++)
		{
			if(j==i)
			{
				minPos = i;
				minVal = data[i];
				
			}
			if(data[j] < minVal)
			{
				minVal = data[j];
				minPos = j;
			}
				
		}
		//把data[i]和data[minPos]交换
		temp = data[minPos];
		data[minPos] = data[i];
		data[i] = temp;
		
	}
	return data;
	 
}

//用例:一个任意的数组
int* inputSort(int* data , int size) //int* 输入,int* 返回修改后的
{
	if(NULL==data&& size <=0)
		return NULL;
	//外重用i:表示已经排序完的部分
	//内重用j,从0 ->i,找一个合适的位置
	int i;int j ; 
	i = j = 0;
	for(i=0;i<size;i++)
	{
		for(j=0;j<=i;j++)
		{
			//把 下标 i 插入 0-> i 里
			if(j == i )
				break;
			// j可能溢出吗? 不可能,如果j比前面都大,不动就好了,i不会溢出,j也不会
			if(data[i] < data[j])
			{
				int temp = data[i];
				// 原先是 j -> i-1; 变成 j+1 ->i
				moveOne(&(data[j]), i-j); //从data[j]开始,i-j个元素 右移一步
				data[j]= temp;
				break;
			}
		}
	}
}
void* bubbleSort(int* data ,int size )  //传入一个数组,C里面数组就要有大小
{
	int sup =0 ; //交换时的辅助变量
	for(int i = 0 ; i < size ; i++)
	{
		for(int j=0; j < size-1; j++)
		{
			if(data[j] > data[j+1])
			{
				sup = data[j];
				data[j] =  data[j+1];
				data[j+1] = sup;
			}
		}
		echoAll(data,size);
	}
	return data;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值