一:冒泡排序:
#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;
}
排序的三种方式(冒泡,插入,和选择)
最新推荐文章于 2021-03-31 14:49:12 发布