1、原始的冒泡排序:
#include<stdio.h>
int main(){
int num[]={3,1,4,10,2,9,7,5,8,6};
int n=10;
for(int i=0;i<n;i++)
for(int j=0;j<n-1-i;j++)
if(num[j+1]<num[j])
{
int t=num[j];
num[j]=num[j+1];
num[j+1]=t;
}
for(int i=0;i<n;i++)
printf("%d ",num[i]);
return 0;
}
时间复杂度:最坏情况:O(n^2)
最好情况:O(n)
平均复杂度:O(n^2)
2、简单优化后的冒泡排序:
思路:优化的地方就在于如果第一趟或者中间某一趟过后,数组已经变得有序,那么接下来不必再做循环了。每趟前利用一个标记,flag=0;若有相邻数的交换,置flag=1;每趟走完后判断flag有无变化,若flag=0,意味着数组已经变得有序,跳出循环;若flag=1,则继续走下一躺。
#include<stdio.h>
int main(){
int num[]={3,1,4,10,2,9,7,5,8,6};
int n=10;
for(int i=0;i<n;i++)
{
int flag=0; //每一轮都要先令flag=0
for(int j=0;j<n-1-i;j++)
if(num[j+1]<num[j])
{
int t=num[j];
num[j]=num[j+1];
num[j+1]=t;
flag=1; //若有相邻数的交换(数组有变化),置flag=1
}
if(flag==0) break; //如果在一趟里面没有相邻数的交换(数组没有变化),意味着已经排好序了,
// 接下来的循环就没有必要做下去了 ,使用break跳出最外的循环 。
}
for(int i=0;i<n;i++)
printf("%d ",num[i]);
return 0;
}
优化后的冒泡排序可以降低一些时间复杂度。
注:更多排序算法请看大神(膜拜q…q)的总结,祝大家和我能早日掌握~~(>_<)~~ 十大经典排序算法