zoukankan      html  css  js  c++  java
  • 冒泡排序和直接选择排序详解

    假设 一个大小为n的数组,元素为a[0],a[1],.........a[n-1]。要排成单调递增。常用的就是冒泡排序和直接选择排序。

    冒泡排序基本思想:

      首先要进行n-1轮冒泡,每次冒泡时把2个元素交换,把最大的放在底部,等冒泡完成了,最后的一个是最大的。

    void bubbleSort (int a[],int n)
    {
        for(int i=0;i<=n-2;i++) //n-1轮
        {
          for(int j=0;j<=n-i-2;j++)
          {
              if(a[j]>a[j+1])
              {
                  int tmp=a[j];a[j]=a[j+1];a[j+1]=tmp;
              }
          }
         
         }
    }

    输入:

    5
    9 8 5 1 4

    输出:

    我在:n-1轮循环内输出元素
    8 5 1 4 9
    5 1 4 8 9
    1 4 5 8 9
    1 4 5 8 9
    请按任意键继续. . .

    助记码:

    i∈[0,N-1)                //循环N-1遍
       j∈[0,N-1-i)            //每遍循环要处理的无序部分
         swap(j,j+1)          //两两排序(升序/降序)
    
     i∈[N-1,0)                //循环N-1遍
       j∈[N-1,N-i-1)            //每遍循环要处理的无序部分
         swap(j,j-1)          //两两排序(升序/降序)
    
     i∈[0,N-1)                //循环N-1遍
       j∈[i+1,N)            //每遍循环要处理的无序部分
         swap(i,j)          //两两排序(升序/降序)

    更多:
    http://zh.wikipedia.org/wiki/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F

    http://blog.csdn.net/morewindows/article/details/6657829

    选择排序:
    每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法

    常见的选择排序细分为简单选择排序、树形选择排序(锦标赛排序)、堆排序。上述算法仅是简单选择排序的步骤。

    void selectSort(int a[],int n)
    {
        
        for(int i=0;i<=n-2;i++)
        {
            int tmp=i;
            for(int j=i+1;j<=n-1;j++)
            {
                if(a[tmp]>a[j])
                {
                    tmp=j;
                }
            }
            if(i!=tmp)
            {
                 int tmp2=a[i];a[i]=a[tmp];a[tmp]=tmp2;
            }
        }
    }

    或:

    void selection_sort(int *a, int len)
    {
        register int i, j, min, t;
        for(i = 0; i < len - 1; i ++)
        {
            min = i;
            //查找最小值
            for(j = i + 1; j < len; j ++)
                if(a[min] > a[j])
                    min = j;
            //交换
            if(min != i)
            {
                t = a[min];
                a[min] = a[i];
                a[i] = t;
            }
        }
    }
    (1)冒泡排序
    冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无 聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改 变,所以冒泡排序是一种稳定排序算法。
    (2)选择排序
    选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个 元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果当前元素比一个元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么 交换后稳定性就被破坏了。比较拗口,举个例子,序列5 8 5 2 9, 我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。

    参考:http://zh.wikipedia.org/wiki/%E9%80%89%E6%8B%A9%E6%8E%92%E5%BA%8F



  • 相关阅读:
    BeyondLinux_Since1991
    TED系列:我们究竟在教AI学习什么
    TED系列:算法的影响
    TED系列:代码-下一代的通用语言
    TED系列:互联网源起故事
    Hadoop-01 搭建hadoop伪分布式运行环境
    JavaSE-26 Swing
    JavaSE-25 AWT
    JavaSE-24 多线程
    JavaSE-23 注解
  • 原文地址:https://www.cnblogs.com/youxin/p/3272733.html
Copyright © 2011-2022 走看看