Author: bakari Date: 2012.7.30
排序算法有很多种,每一种在不同的情况下都占有一席之地。关于排序算法我分“经典排序之”系列分别述之。本篇为冒泡排序。
冒泡排序是最古老的排序,我们最早开始学的排序算法:
冒泡排序总共有三种不同的形式,对应三种不同的排序算法。(C++语言)
先看类的描述:
1 /************************************************
2 * Author: bakari Date: 2012.7.30
3 * 三种冒泡排序
4 * 第一种:将最小的元素冒泡到最前面
5 * 第二种:将最大的元素冒泡到最后面
6 * 第三种:双向冒泡
7 ************************************************/
8 class BubbleSort
9 {
10 int len;
11 vector<int> BubbleList;
12 public:
13 BubbleSort(vector<int>,int);
14 void Bubble_Sort1();
15 void Bubble_Sort2();
16 void Bubble_Sort3();
17 void Swap(int,int);
18 void Print();
19 };
1、将小元素冒泡到最前面,首先操作的是小元素。
1 // 第一种
2 void BubbleSort::Bubble_Sort1()
3 {
4 for (int i = 0; i != len - 1; ++i)
5 {
6 for (int j = i + 1; j != len; ++j)
7 {
8 if (BubbleList[j] < BubbleList[i])
9 Swap(i,j);
10 }
11 }
12 }
2、将最大的元素冒泡到最后面
1 //第二种
2 void BubbleSort::Bubble_Sort2()
3 {
4 for (int i = 0; i != len; ++i) //注意和上面的算法对照此循环
5 {
6 for (int j = 0; j != len - 1 - i; ++j) //j只能到len - 1;
7 {
8 if(BubbleList[j + 1] <BubbleList[j])
9 Swap(j + 1,j);
10 }
11 }
3、双向冒泡
怎么个双向法请看代码:
1 //第三种
2 void BubbleSort::Bubble_Sort3()
3 {
4 int left = 0;
5 int right = len - 1;
6 int i;
7 while (left < right)
8 {
9 for (i = left;i != right; ++i) //从左到右冒泡
10 {
11 if (BubbleList[i + 1] < BubbleList[i])
12 Swap(i + 1,i); //交换
13 }
14 right = i - 1;
15 for (i = right;i != left; --i) //从右到左冒泡
16 {
17 if (BubbleList[i - 1] > BubbleList[i])
18 Swap(i - 1,i);
19 }
20 left = i + 1;
21 }
22 }