既然写了计组思来想去便打算把数据结构也写下来,写的时候总是发现看的时候无法发现的问题,受益良多。
交换排序的基本思想: exchange until sorted
顺序,分支,循环
(注意伪代码的熟悉
下面介绍两种交换算法
- 冒泡排序(Bubble sort)
首先进行联想,用一个图进行辅助联想:
![c67bafbafd626990bc46e6f0fd58340f.png](https://img-blog.csdnimg.cn/img_convert/c67bafbafd626990bc46e6f0fd58340f.png)
图片顶部是数组的begin,底部理解为数组end。冒泡排序的过程就是最下面的水滴往上冒泡的过程,最后最小的气泡在最上面,最大的气泡在最底下。(重力
我们把整个过程进行抽象和精炼下出如下冒泡排序的算法思路:
1. 冒泡排序从低往上进行exchange,根据空间的连续性(滑稽,首先进行比较的是这个泡泡最接近的上面的泡泡,将某个泡泡送到他最终的位置(因此冒泡排序具有全局有序
)
2.两个气泡相互交换,小的气泡(权值小的)继续进行冒泡的过程直到到达了规定位置
for(从0开始到数组末端-1(最后就一个数字,选择每次冒泡的终点位置){
for(从队尾末端(思考为什么是末端)开始进行交换过程,直到到达指定位置){
if(从下冒上来的泡泡小,就可以进行交换){
swap;
}
}
}
下面可以进行两个练习:
- 写出 冒泡排序算法的完全代码
- 分析冒泡排序过程中的冗余过程,考虑如何进行优化(tip:及时中断)
Bubble sort 算法分析
ps:对于已经优化的排序算法进行分析
- 最好
数组已经为正序,一遍扫描就好了,进行n-1次比较,不需要移动故:
(C是关键词进行比较的次数,M是进行移动的次数)
所以bubble sort 的最好时间复杂度是
- 最坏
数组为逆序,进行n - 1 次排序,每次排序需要进行
所以bubble sort 的最坏时间复杂度是
- 平均
冒泡排序的平均情况分析较为复杂,但是可以知道平均的排序趟数仍为
当然 i > j 且数组R[i] = R[j]时,由于他们之间没有逆序,所以不会进行交换,所以冒泡排序是稳定的排序算法。
前面思考题的答案,注释的是第二问的优化
void Bubble_sort(int a[], int n){
int i, j;
//bool exchange;
for (i = 0; i < n - 1; ++i)
{
//exchange = false;
for(j = n - 1; j > i; ++j){
if (a[j] > a[j - 1])
{
swap(a[j], a[j - 1]);
//exchange = true;
}
}
//if(!exchange)return;
}
}
Talk is easy, show me the code. XD