选择排序/冒泡排序/快速排序
例子序列:176453 从小到大排序
1.选择排序
自己的话概括:每个位置上的数字都是由在这个位置之后的所有数字中选择的一个最小的数字。
【1】 1 7 6 4 5 3
【2】 1 7 6 4 5 3
【3】 1 3 6 4 5 7
【4】 1 3 4 6 5 7
【5】 1 3 4 5 6 7
完成排序!
代码实现:
#include<stdio.h>
int main()
{
int i,j,index,n,t,index,a[100];
scanf("%d",&n);//输入几个数的排序
for(i=0;i<n;i++)
scanf("%d",&a[i]);//输入数字
for(i=0;i<n-1;i++){
index=i;//标记最小数的下标
for(j=i+1;j<n;j++)
if(a[index]><a[j]) index=j;
if(index>i)//交换两个位置上的数字
t=a[index],a[index]=a[i],a[i]=t;
}
for(i=0;i<n;i++)
printf("%4d",a[i]);//排序后依次输出
return 0;
}
当然也可以不用index,
#include<stdio.h>
int main()
{
int i,j,index,n,t,a[100];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(a[i]>a[j]){ //每次都要进行比较
t=a[i],a[i]=a[j],a[j]=t;
}
for(i=0;i<n;i++)
printf("%4d",a[i]);
return 0;
}
以上代码实现的是所选位置上的数字需要与之后每个位置上的数字都进行比较,只要比它小就进行交换,当循环结束后留下的就是最小的数字。
2.冒泡排序
自己的话概括:通过相邻元素的不断比较,使最大的元素右移到最后。
【1】1 7 6 4 5 3
【2】1 7 6 4 5 3
【3】1 6 7 4 5 3
【4】1 6 4 7 5 3
【5】1 6 4 5 7 3
【6】1 6 4 5 3 7 (7被移到最后
【7】1 6 4 5 3 7
【8】1 4 6 5 3 7
【9】1 4 5 6 3 7
【10】1 4 5 3 6
…
代码实现:
#include<stdio.h>
int main(){
int i,j,index,n,t,a[100],flag;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n-1;i++){//外循环,表示已有多少数排好序
flag=0;
for(j=0;j<n-1-i;j++) //内循环,相邻元素的不断比较后移
if(a[j+1]<a[j]){ //相邻元素进行比较
t=a[j+1],a[j+1]=a[j],a[j]=t;
flag++;
}
if(flag==0) break;//表示当前已顺序,无需排序
}
printf("%d,%d\n",i,flag);
for(i=0;i<n;i++)
printf("%4d",a[i]);
return 0;
}
3.快速排序
自己的话概括:拿出一个数,使左边的数都比它小,右边的数都比它大。
代码实现:
#include<stdio.h>
int b[100];
void qsort(int l,int r){//快速排序的左端和右端
if(l>=r) return;//结束条件
int i=l,j=r,key=b[i];//定义左端数字为基准,左边的数都比基准小,右边的数都比基准大。
while(i<j){
while(i<j&&b[j]>=key) j--;//右端正序,端号往左移
if(i<j) b[i]=b[j];//循环打破,右端逆序
while(i<j&&b[i]<=key) i++;//左端正序,端号往右移
if(i<j) b[j]=b[i];//循环打破,左端逆序
}
b[i]=key;
qsort(l,i-1);//递归,左边组继续排序
qsort(i+1,r);
}
int main()
{
int i,n;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&b[i]);//输入数字
qsort(0,n-1);//调用函数排序
for(i=0;i<n;i++)//输出排序好的数字
printf("%4d",b[i]);
return 0;
}
例子代码运行结果: