选择排序/冒泡排序/快速排序

选择排序/冒泡排序/快速排序

例子序列: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;
}

例子代码运行结果:
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值