排序的算法多种多样,在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]);
}
}
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);
}
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]);
}
}
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]);
}
}
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]);
}
}