排序算法之冒泡排序
2015-04-04 13:54
316 查看
题目传送门
/* BubbleSort_2(),_3()为优化版 用zstu3539题目来验证算法的正确性 */ #include <cstdio> #include <iostream> #include <algorithm> #include <ctime> #include <cstdlib> using namespace std; const int maxn = 1000000 + 10; const int INF = 0x3f3f3f3f; int a[maxn]; void BubbleSort(int *a, int n) { for (int i=1; i<=n-1; ++i) { for (int j=1; j<=n-i; ++j) { if (a[j] > a[j+1]) swap (a[j], a[j+1]); } } } void BubbleSort_2(int *a, int n) //若不进行交换,已排好序,算法结束 { for (int i=1; i<=n-1; ++i) { int pos = 0; for (int j=1; j<=n-i; ++j) { if (a[j] > a[j+1]) { swap (a[j], a[j+1]); pos = j; } } if (pos == 0) break; } } void BubbleSort_3(int *a, int n) //一次冒泡得到最大值和最小值,排序次数几乎减少一半 { int l = 1, r = n; while (l < r) { for (int i=l; i<r; ++i) //正向冒泡 { if (a[i] > a[i+1]) swap (a[i], a[i+1]); } --r; for (int i=r; i>l; --i) //反向冒泡 { if (a[i] < a[i-1]) swap (a[i], a[i-1]); } ++l; } } int main(void) { //freopen ("rand_small.in", "r", stdin); int n; while (scanf ("%d", &n) != EOF) { if (n == 0) continue; for (int i=1; i<=n; ++i) { scanf ("%d", &a[i]); } BubbleSort (a, n); //BubbleSort_2 (a, n); //BubbleSort_3 (a, n); bool flag = true; for (int i=1; i<=n; ++i) { if (flag) { printf ("%d", a[i]); flag = false; } else printf (" %d", a[i]); } puts (""); } return 0; }
相关文章推荐
- 排序算法__冒泡排序
- 排序算法入门之冒泡排序优化
- 排序算法之冒泡排序(Java)
- 各种排序算法总结----基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
- 排序算法:冒泡排序
- 排序算法之冒泡排序
- 记录自已学习之排序算法(冒泡排序)
- 排序算法-冒泡排序
- 排序算法之冒泡排序
- 基本排序算法——冒泡排序java实现
- 排序算法之冒泡排序
- 排序算法-冒泡排序 java
- 排序算法——冒泡排序(Bubble Sort)
- 排序算法之冒泡排序
- 排序算法之冒泡排序
- C语言单链表的3种排序算法,插入排序,冒泡排序,选择排序
- 排序算法之冒泡排序
- C#的四种排序算法:冒泡排序、选择排序、插入排序和希尔排序
- 基本排序算法之冒泡排序
- 排序算法(一)——冒泡排序及改进