c语言的简单排序:选择排序和冒泡排序及他们的优化

排序的算法多种多样,在c语言阶段接触较多的是冒泡和选择,下面就给出两种排序的实现。

(1)、冒泡排序:

# include<stdio.h>
void main()
{
 int arr[]={11,88,66,22,77,55,44,99,33};
 int len=sizeof(arr)/sizeof(arr[0]);
 for(int i=0;i<len-1;i++)
 {
  for(int j=0;j<len-i-1;j++)
  {
   if(arr[j]>arr[j+1])
   {
    int temp=arr[j];
    arr[j]=arr[j+1];
    arr[j+1]=temp;
   }
  }
 }
 for(int i=0;i<len;i++)
 {
  printf("%5d",arr[i]);
 }
}
优化版本:
# include<stdio.h>
void main()
{
 int arr[]={10,1,2,3,4,5,6,7,8,9};//对于一些特殊的情况可减少循环次数
 int count=0;//循环次数计数器
 int len=sizeof(arr)/sizeof(arr[0]);
 bool flag=0;//标识符
 for(int i=0;i<len-1;i++)
 {
  flag=0;
  for(int j=0;j<len-i-1;j++)
  {
   count++;
   if(arr[j]>arr[j+1])
   {
    flag=1;//进入标识符值改变
    int temp=arr[j];
    arr[j]=arr[j+1];
    arr[j+1]=temp;
   }
  }
  if(flag==0)
  {
   break;
  }
 }
 for(int i=0;i<len;i++)
 {
  printf("%d  ",arr[i]);
 }
 printf("\n");
 printf("%d\n",count);
}

(2)、选择排序:


# include<stdio.h>
void main()
{
 int arr[]={11,88,66,22,77,55,44,99,33};
 int len=sizeof(arr)/sizeof(arr[0]);
 for(int i=0;i<len-1;i++)
 { 
  for(int j=i+1;j<len;j++)
  {
   if(arr[i]>arr[j])
   {
    int temp=arr[i];
    arr[i]=arr[j];
    arr[j]=temp;
   }
  }
 }
 for(int i=0;i<len;i++)
 {
  printf("%d  ",arr[i]);
 }
}


优化版本:改用每趟都找到该趟的最小值从而减少比较的次数。
# include<stdio.h>
void main()
{
 int arr[]={11,88,66,22,77,55,44,99,33};
 int len=sizeof(arr)/sizeof(arr[0]);
 int min,min_index=0;
 for(int i=0;i<len-1;i++)
 {
  min=arr[i];
  for(int j=i+1;j<len;j++)
  {
   if(min>arr[j])
   {
    min=arr[j];
    min_index=j;
   }
  }
  if(min_index!=i)
  {
   int temp=arr[i];
   arr[i]=arr[min_index];
   arr[min_index]=temp;
  }
 }
 for(int i=0;i<len;i++)
 {
  printf("%d  ",arr[i]);
 }
}


猜你喜欢

转载自blog.csdn.net/magic_world_wow/article/details/79136087