按从小到大排序数组。
思考:排序的方法很多,如快冒泡排序,归并排序,堆排序,快速排序等等。如运用迭代的思想怎么思考这一问题呢?我们可以从小处着手,从小到大排序,就是说任何二个相邻的数,左边的数都不大于右边的数。利用这个规则,可以这么做,从左到右寻找,只要发现有相邻的二个数左边大于右边的,则交换,不断重复这个过程,直到某一次从左到右寻找一遍都没有发现左边比右边大的情况,那就说明整个数组已经重小到大排好了,就不用再寻找了。上面这个分析过程就是迭代的思想了,这过程写成程序(本文所有程序都用C++语言编写)如下,假设数据已经放在数组a[1~N]中。
int ok=0; //定义一个开关,标志任务是否完成,ok=0表示还没完成
while(!ok){ //如果还没有排好,那就继续
ok=1;//假设已经排好序了。
for(int i=1;i<N;i++){ //从头到尾枚举相邻的一对数
if(a[i]>a[i+1]){ //比较相邻的一对数,如果发现左边比右边大,则交换
swap(a[i],a[i+1]);
ok=0; //发现有不符合规则的情况,至少还要继续从头到尾找一遍。
}
}
}
观察上面代码片断,是个双重循环,第一重while的循环次数是不固定的,最少是1次,最大是N次,所以时间复杂度是O(N)~O(N^2)之间,慢的时候不会比冒泡算法O(N^2)更慢,快的时候会比快排O(N*logN)还快。
5
3 2 1 5 4
1 2 3 4 5