排序的三种方式(冒泡,插入,和选择)

一:冒泡排序:
#include<stdio.h>
#include<string.h>

void bubble_sort(int *arr,int len)
{
	
	int i=0;
    int j=0;
	int tmp=0;
	int flag=0;//设置标志位,从而来判断每次进入内层循环时是否有数据的交换,减少程序的运行
	int mark=len-1;//控制内部循环的次数
	int n=0;//保存内部循环数字交换的最后一位的下表
	for(i=0;i<len-1;i++)
	{
		flag=1;
		for(j=0;j<mark;j++)
		{
			if(arr[j]>arr[j+1])
			{
				tmp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=tmp;
				flag=0;//如果内部发生交换,则flag设置为0
                n=j;//保存最后一次交换的位置的下标
			}
		}
		if(flag)//如果一趟走完flag为1,说明内部没有发生交换。证明后面的数字已经有序,直接跳出
		{
			break;
		}
		mark=n;//将下标赋给mark,减少下次内部循环的次数,提高效率
	}
}
int main()
{
	int  arr[]={1,9,6,8,7,3,2};
    int  len=sizeof(arr)/sizeof(arr[0]);
	int  i=0;
	bubble_sort(arr,len);
    for(i=0;i<len;i++)
	{
		printf("%d ",arr[i]);
	}
	return 0;
}


二:选择排序:
#include<stdio.h>
#include<string.h>
void Selection_sort(int *arr,int len)
{
	int i=0;
	int j=0;
	int min=0;//用于交换数字
	int k=0;//记录最小数字的下标
	if(len==1)//如果只有一个数字,不必排序,直接返回
	{
		return ;
	}
	for(i=0;i<len-1;i++)//从第一个数字开直到倒数第二个数字结束比较
	{
		k=i;//记录每次开始的下标
		for(j=i+1;j<len;j++)//从小一次下标开始,寻找最小值的下标
		{
			if(arr[j]<arr[k])
			{
				k=j;//用k记住
			}
		}
		if(k!=i)//如果k不是开始进入时的下标,则交换变量
		{
			min=arr[k];//把k下标之后的最小值和k下标的值做交换
			arr[k]=arr[i];
			arr[i]=min;
		}
	}
}
int main()
{
	int  arr[]={1,9,6,8,7,3,2};
    int  len=sizeof(arr)/sizeof(arr[0]);
	int  i=0;
    Selection_sort(arr,len);
    for(i=0;i<len;i++)
	{
		printf("%d ",arr[i]);
	}
	return 0;
}



三:直接插入排序:
#include<stdio.h>
#include<string.h>
void Direct_insertion_sort(int *arr,int len)
{
	int i=0;
	int j=0;
	int tmp=0;//记录每次排序完成后的最后一个数字的后一位,就是待排序的数字
	for(i=1;i<len;i++)//默认第一个数字已经排好序,从第二个数字开始
	{
		tmp=arr[i];//记录每次的待排序的数字
		j=i-1;//待排序数字的前一位数字的下标
         while((arr[j]>tmp)&&(j>=0))//用while循环,将待排序的数字和前面以排好的数字进行一一的比较
		 {
			 arr[j+1]=arr[j];//符合条件就向后移
			 j--;
		 }
		 arr[j+1]=tmp;//a[i]插入适当位置
	}
}
int main()
{
	int  arr[]={1,9,6,8,7,3,2};
    int  len=sizeof(arr)/sizeof(arr[0]);
	int  i=0;
    Direct_insertion_sort(arr,len);
    for(i=0;i<len;i++)
	{
		printf("%d ",arr[i]);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值