关闭

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

标签: 排序冒泡直接插入排序选择排序
168人阅读 评论(0) 收藏 举报
分类:
一:冒泡排序:
#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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:22262次
    • 积分:1626
    • 等级:
    • 排名:千里之外
    • 原创:145篇
    • 转载:5篇
    • 译文:0篇
    • 评论:8条
    最新评论