#选择排序和冒泡排序#
- 复习基础算法,同时作为备忘录
- 这个算法首先假定最大最小的元素,需要三个变量表示元素的下标,分别表示当前,最大/小,每次循环最大/小。按照这个思想写出代码
选择排序:
#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