排序算法的原理及C语言实现

排序算法通过比较进行选择元素的顺序,所以从大到小排序和从小到大排序的原理是相似的,只需要改变比较条件即可,这里采用从小到大的排序方式进行实现。

冒泡排序

  冒泡排序的原理:
  	对于一串序列 a1.......an ,从头开始到末尾,如果当前元素 
  	ai 大于 ai+1,那么就交换,然后继续依次的比较,那么到达 an 的时候,
  	n位置所放的元素则是这一编下来的最大的元素,这很好理解。
  	如果有一个最大的元素,从前往后进行比较进行交换位置,
  	那么若干次交换后大的元素肯定是交换到最后面的位置的。
  	所以根据这个原理,只需要进行n-1次的遍历就可以让序列有序。
  	如果一趟下来都没有发生交换,说明序列已经有序,也可以提前退出算法。
void Bubbling(int a[],int n )
{
	int i , j , flag = 0 , temp ; 
	//因为只需要n-1次遍历,所以从i=1开始即可(到最后a[0]固然就是最小的那个元素) 
	for(i=1;i<n;i++)
	{
		flag = 0 ; 
		for(j=0;j<n-i-1;j++)
		{
			//如果前一个元素大于后一个元素,则进行交换 
			if(a[i-1]>a[i])
			{
				flag = 1 ; 
				temp = a[i] ; 
				a[i] = a[i-1] ; 
				a[i-1] = temp  ;
			}
		}
		//没有发生一次交换,说明序列有序 
		if(!flag)
		break ; 
	}	
	return ; 
}

排序结果:
在这里插入图片描述
对冒泡排序的算法进行分析,冒泡排序最优的情况就是当数组的排列顺序和目标顺序一致的时候(在这里就是从小到大排序),这时候只需要一趟下来就能使得序列有序也就是O(n),最坏的情况就是排序和预期相反(这里就是从大到小排序),这时候每次遍历都需要进行 n-i-1次交换,时间复杂度为o(n^2),冒泡排序的平均时间复杂度为O(N**2)

选择排序

// An highlighted block
#include<stdio.h>
/*
	选择排序的思路:
		每次遍历,找出元素中最小或最大的元素,放到序列前端。
	就类似于站队一样,每次选择剩下人中,最高或最矮的放到队伍前面,这样执行n-1次就能使得队伍有序,(因为前n-1个有序,最后剩下那个肯定是最大或者最小的那个)	 
*/
void select_sort(int a[] , int n );

int main(){
	
	int a[10] = {5,8,1,3,46,56,8,7,78,10}  , i  ;
	select_sort(a,10) ; 
	for(i = 0 ; i < 10 ; i++){
		printf("%d ",a[i]) ; 
		if(i == 9)
		printf("\n") ;  
	}
	return 0 ; 
}

/*
	改函数用于从小到大最数组排序 
	@ i , j  循环遍历
	@ min    用于保存剩余元素中最小元素的下标 
*/ 
void select_sort(int a[] , int n ){
	int i ,  j , min , temp ; 
	for(i = 0 ; i < n-1 ; i++){
		min = i ; 
		for(j = i+1 ; j < n ; j++){
			//用于找到最小的那个元素 
			if(a[j]<a[min]){
				min = j ;  
			}
		}
		//交换第i个位置与剩余元素最小的那个元素的位置 
		temp = a[min] ; 
		a[min] = a[i] ; 
		a[i] = temp ; 
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值