#include<stdio.h>
/*
1、冒泡排序共须进行n-1趟排序(外层i从n-1递减到1,控制排序的趟数,i也是每趟排出来的数的下标数)
2、每趟排序都从下标为0的数字开始,依次与下一项进行比较,是否交换的操作(内层j从0递增到i-1)
3、每趟设置flag初值为0,每次交换都将flag赋值为1,如果一趟排序过后flag仍未0,说明此趟排序没有交换操作,即至此排序完成
*/
void BubbleSort(int a[],int n)
{
int i,j,temp,flag;
for(i=n-1;i>=1;i--) //i控制排序的趟数,i也是每趟排出来的数的下标数
{
flag=0;
for(j=0;j<=i-1;j++)
{
if(a[j]>a[j+1]) //j控制比较和交换(严格的">"表示排序是稳定的)
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
flag=1; //标志发生了交换
}
}
if(!flag) break;
}
}
void InsertionSort(int a[],int n)
{
int i,j,temp;
for(i=1;i<=n-1;i++)//控制每次要插的数字
{
temp=a[i];
for(j=i-1;j>=0 && a[j]>temp;j--)//控制比较和向后赋值的操作
a[j+1]=a[j];
a[j+1]=temp;
}
}
/*
选择排序法的第一层循环从起始元素开始选到倒数第二个元素,主要是在每次进入的第二层循环之前,将外层循环的下标赋值给临时变量,
接下来的第二层循环中,如果发现有比这个最小位置处的元素更小的元素,则将那个更小的元素的下标赋给临时变量,
最后,在二层循环退出后,如果临时变量改变,则说明,有比当前外层循环位置更小的元素,需要将这两个元素交换.
*/
void SelectionSort(int a[],int n)
{
int i,j,min,t;
for(i=0;i<=n-2;i++)
{
min=i;
for(j=i+1;j<=n-1;j++)
{
if(a[min]>a[j])
min=j;
}
if(min!=i)
{
t=a[min];
a[min]=a[i];
a[i]=t;
}
}
}
int main()
{
int a[5]={2,1,4,3,5},b[5]={2,1,4,3,5},c[5]={2,1,4,3,5},i;
BubbleSort(a,5);
for(i=0;i<5;i++)
printf("%d\n",a[i]);
InsertionSort(b,5);
for(i=0;i<5;i++)
printf("%d\n",b[i]);
SelectionSort(c,5);
for(i=0;i<5;i++)
printf("%d\n",c[i]);
return 0;
}
几种简单的排序
最新推荐文章于 2022-01-20 19:58:18 发布