选择排序和冒泡排序

#选择排序和冒泡排序#

  1. 复习基础算法,同时作为备忘录
  2. 这个算法首先假定最大最小的元素,需要三个变量表示元素的下标,分别表示当前,最大/小,每次循环最大/小。按照这个思想写出代码

选择排序:

#include<stdio.h>
void main()
{
    int a[10];
    int i,j,w;
    printf("请输入10个数字: \n");
    for(i=0;i<10;i++)
    scanf("%d",&a[i]);
   
    for(i=0;i<10;i++)
	{
        for(j=i+1;j<10;j++)
        if(a[i]<a[j])
       {
           w=a[i];
           a[i]=a[j];
           a[j]=w;
       }
	}
}

再说冒泡排序。主要采用相邻两数两两比较,如果后一个比前一个大或者小,
则将其调换位置,直至所有的数都比较完。如果给定一个大小为n的数组,
那么需要比较n-1趟,每一趟比较n-1-i次 ,i 表示上次循环中已经
比较完的下标。写两个循环判断,如需交换则进行交换,
如果不需要交换则进行下两个数的比较,直到所有的数比较完。主要代码如下:

#include<stdio.h>
#define N 10
void main()
{//递增排序
   int a[10];
   int i,j,t;
   printf("请输10个数字: \n");
    for(i=0;i<10;i++)
   scanf("%d",&a[i]);

    for(i=1;i<10;i++)
    {
       for(j=0;j<N-i;j++)
       if(a[j]>a[j+1])
      {
           t=a[j];
           a[j]=a[j+1];
           a[j+1]=t;
      }
    }
    for(i=0;i<10;i++)
       printf("%d ",a[i]);
    printf("\n");
	return 0;
}

##冒泡时间复杂度改进

每一遍开始,设置change=false。处理时,一旦发生数据交换,就将change修改为true。结束时,若change未变,表示未发生数据交换,即已递增有序,如当前数列,a0,a1……ai,ai+1,……,an-1,当前处理范围是a0ai,0<=i<=n,如果a0ai已经有序,显然不会发生数据交换,所以change未变,即已经是递增有序,排序可结束,否则会发生数据交换,change会被修改为true,需要下一遍的处理
具体改进代码

//类C语言描述 
void bubble(int a[],int n)
{
	int i=n-1,temp;
	do{
		int  change = false;   //1或n-1 
		for(j=0;j<i;++j)       //n-1或n*(n-1)/2 
		{
			if(a[j]>a[j+1]//n-1或n*(n-1)/2 
			 {
			 	temp = a[j];   //0或 n*(n-1)/2 
			 	a[j] = a[j+1]; 
			 	a[j+1] = temp;
			 	change = true; //0或 n*(n-1)/2 
			 }
		}
	}while(change&&--i>=1)		//1或n-1 
}
//最好的情况算法复杂度:T最好(n)=O(f最好(n))=O(n)
//最坏情况下算法复杂度: T最坏(n)=O(f最坏(n))=O(n*n)

参考
https://blog.csdn.net/zjy18886018024/article/details/80718713

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值