您的位置:首页 > 编程语言 > C语言/C++

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

2018-01-23 10:13 344 查看
排序的算法多种多样,在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]);

 }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: