zoukankan      html  css  js  c++  java
  • 经典排序:冒泡排序法与选择排序法

    例题:FJUTOJ 1842

    冒泡排序 (Bubble sort)

    原理是取相邻两个数进行大小比较,判断是否交换。

    以从小到大排序为例,冒泡排序就像气泡一样,最小的数慢慢浮上来,最大的数慢慢沉下去。那么完整从头到尾做一次之后最后一位就是原序列中最大的数字了。然后只需要对1~(n-1)个数字进行排序,完成后倒数第二个数字也为原序列的1~n-1元素中最大的值。如此重复,进行n-1次一定能完成排序。参考代码:

     1 #include <stdio.h>
     2 void BubbleSort(int *, int);
     3 int main()
     4 {
     5     int a[] = {9, 5, 3, 6, 7, 2, 5, 4, 3, 9}, i;
     6     int s = sizeof(a) / sizeof(int);
     7     puts("Before sort:");
     8     for(i = 0; i < s; i++)
     9         printf("%d ", a[i]);
    10     BubbleSort(a, s);
    11     puts("\nAfter sort:");
    12     for(i = 0; i < s; i++)
    13         printf("%d ", a[i]);
    14     return 0;
    15 }
    16 void BubbleSort(int *a, int s) // a为待排序数组 s为数组中需排序长度
    17 {
    18     int i, j, tmp;
    19     for(i = 0; i < s - 1; i++)
    20     {
    21         for(j = 1; j < s - i; j++)
    22         {
    23             if(a[j - 1] > a[j])
    24             {
    25                 tmp = a[j - 1];
    26                 a[j - 1] = a[j];
    27                 a[j] = tmp;
    28             }
    29         }
    30     }
    31 }

    优化:如果一整趟下来都没有一次交换,那么确定该序列已经满足单调,直接跳出循环可以省时。

     1 void BubbleSort(int *a, int s) // a为待排序数组 s为数组中需排序长度
     2 {
     3     int i, j, tmp;
     4     int swap_flag; // 标记一趟内是否有交换过
     5     for(i = 0; i < s - 1; i++)
     6     {
     7         swap_flag = 0;
     8         for(j = 1; j < s - i; j++)
     9         {
    10             if(a[j - 1] > a[j])
    11             {
    12                 swap_flag = 1;
    13                 tmp = a[j - 1];
    14                 a[j - 1] = a[j];
    15                 a[j] = tmp;
    16             }
    17         }
    18         if(swap_flag == 0) break;
    19     }
    20 }

    选择排序 (Select sort)

    以从小到大排序为例。原理是在序列中挑一个最小的值,然后与序列中的第一个交换。那么,第一个就是整个序列中最小的数字。再对从第二个数字开始的序列做这个操作,得到剩余序列中最小的数字所在位置,与原序列第二个数交换,以此类推做n-1完成排序。参考代码:

    void SelectSort(int *a, int s) // a为待排序数组 s为数组中需排序长度
    {
        int i, j, tmp, min_num_index;
        for(i = 0; i < s - 1; i++)
        {
            min_num_index = i;
            for(j = i + 1; j < s; j++)
            {
                if(a[j] < a[min_num_index])
                    min_num_index = j;
            }
            if(min_num_index != i)
            {
                tmp = a[i];
                a[i] = a[min_num_index];
                a[min_num_index] = tmp;
            }
        }
    }
  • 相关阅读:
    切换某个窗口为当前窗口并显示在最前面---非置顶
    C语言算法-求两直线夹角计算公式
    Qt编译时MinGW去掉对gcc动态库的依赖
    解决不能从 WTL::CString 转换为 ATL::CSimpleString & 的问题
    gcc编译器对宽字符的识别
    4月10日学习笔记——jQuery选择器
    HTML5
    4月8日学习笔记(js基础)
    网站易用性2
    网站易用性
  • 原文地址:https://www.cnblogs.com/sandychn/p/8280817.html
Copyright © 2011-2022 走看看