一.冒泡排序
内层循环一遍:数列从头开始遍历,相邻两值比较大小,得出当前数列内的最大(最小)值,沉底。
外层循环一遍:数列排除先前沉底的数值,当前的新数列再次遍历,得到第二个沉底的最大(最小)值。
int i,j,temp;
int a[10]={12,5,1,8,0,3,99,32,92,6};
for(i=0;i<10;i++)
{
for(j=0;j<9-i;j++) //一次沉底
{
if(a[j]>a[j+1]) //靠前值大于靠后值时,交换
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for(i=0;i<10;i++) //显示排列结果
printf("%d ",a[i]);
二.选择排序
从第一个位置开始,从到尾遍历一次,得到最小(最大)值,放在这个位置。下一次遍历,得到的最小(最大)值,放在当前位置的下一个位置。
int i,j,temp;
int a[10]={99,2,1,5,0,10,12,32,45,88};
for(i=0;i<10;i++)
{
for(j=i+1;j<10;j++)
{
if(a[i]>a[j]) //当前位置的值,与整个列表的值比较,得最小值
{
temp=a[j];
a[j]=a[i];
a[i]=temp;
}
}
}
for(i=0;i<10;i++) printf("%d ",a[i]); //显示排列后结果
三.插入排序
排序最开始时,把第一个元素当作一个有序数列。当前待比较的元素与此元素前的数列中的元素,从后往前逐一比较。此元素前的数列都是有序的,找到何适位置,插入,形成新的,多一位的有序数列。
外层循环一次,进入下一个待插入的元素的插入排序过程。
int i,j,temp;
int a[10]={99,2,1,5,0,10,12,32,45,88};
for(i=1;i<10;i++)
{
temp=a[i]; //待插入元素的值temp
for(j=i-1;j>=0&&a[j]>temp;j--)
{
a[j+1]=a[j]; //比temp大的值都后移一位
}
a[j+1]=temp; //插入
}
for(i=0;i<10;i++) //显示排序后结果
printf("%d ",a[i]);
四.二分排序
在插入排序的基础上,用二分查找的思想,找到与待插入值比较的位置。
int i,j,temp,start,end,mid;
int a[10]={99,2,1,5,0,10,12,32,45,88};
for(i=0;i<10;i++)
{
temp=a[i];
start=0;
end=i-1;
while(start<=end) //二分法,找到插入点
{
mid=(start+end)/2;
if(a[mid]>temp) end=mid-1;
else start=mid+1;
}
for(j=i-1;j>end;j--) //插入点之后的元素逐一后移一位
{
a[j+1]=a[j];
}
a[j+1]=temp; //当前位置插入
}
for(i=0;i<10;i++) printf("%d ",a[i]); //显示排序结果