zoukankan      html  css  js  c++  java
  • 排序算法之冒泡排序、选择排序

    插入排序,堆排序,选择排序,归并排序和快速排序,冒泡排序都是比较排序,它们通过对数组中的元素进行比较来实现排序;其他排序算法则是利用非比较的其他方法来获得有关输入数组的排序信息
     
    冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
     
    它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
    这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。
     
    冒泡排序算法的运作如下:
    比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
    针对所有的元素重复以上的步骤,除了最后一个。
    持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
    (最大的数走第一趟就沉到最底,次大的数第二趟沉到最大的数上面)
     
    选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
    选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。稳定的算法,通俗地讲,就是两个相等的数不会交换位置。这里涉及到关键码的问题。在数据结构中关键码指的是数据元素中能起标识作用的数据项,例如,书目信息中的登陆号和书名等。其中能起唯一标识作用的关键码称为“主关键码”,如登陆号;反之称为“次关键码”,如书名,作者名等。通常一个数据元素只有一个主码,但可以有多个次码。
    假设一个文件有n条纪录,排序就是将此n个纪录按照关键码的大小递增(或递减)的次序排列起来,使这些纪录由无序变为有序的一种操作。
    若在待排序的纪录中,存在两个或两个以上的关键码值相等的纪录,经排序后这些记录的相对次序仍然保持不变,则称相应的排序方法是稳定的方法,否则是不稳定的方法。
     
     
     1 #include<iostream>
     2 #include<time.h>
     3 #include<iomanip>
     4 using namespace std;
     5 const int N=10;
     6 int main()
     7 {
     8     int a[N],i,j,temp,b;
     9     srand(time(NULL));
    10     for(i=0;i<N;i++)
    11         a[i]=rand()%100;
    12     for(i=0;i<N;i++)
    13         cout<<setw(3)<<a[i];
    14     cout<<endl;
    15     for(i=0;i<N-1;i++)
    16     {
    17         temp=i;
    18         for(j=i+1;j<N;j++)
    19         {
    20             if(a[temp]>a[j])
    21                 temp=j;
    22         }
    23         if(i!=temp)
    24         {
    25             b=a[temp];
    26             a[temp]=a[i];
    27             a[i]=b;}
    28     }
    29     for(i=0;i<N;i++)
    30         cout<<setw(3)<<a[i];
    31     cout<<endl;
    32 }
    选择排序法的第一层循环从起始元素开始选到倒数第二个元素,主要是在每次进入的第二层循环之前,将外层循环的下标赋值给临时变量,接下来的第二层循环中,如果发现有比这个最小位置处的元素更小的元素,则将那个更小的元素的下标赋给临时变量,最后,在二层循环退出后,如果临时变量改变,则说明,有比当前外层循环位置更小的元素,需要将这两个元素交换.
    简单选择排序的基本思想:第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换;第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换;以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。
     
    以下为简单选择排序的存储状态,其中大括号内为无序区,大括号外为有序序列:
    初始序列:             {49 27 65 97 76 12 38}
    第1趟:12与49交换:12{27 65 97 76 49 38}
    第2趟:27不动:      12 27{65 97 76 49 38}
    第3趟:65与38交换:12 27 38{97 76 49 65}
    第4趟:97与49交换:12 27 38 49{76 97 65}
    第5趟:76与65交换:12 27 38 49 65{97 76}
    第6趟:97与76交换:12 27 38 49 65 76 97 完成
     
    简单选择排序过程中需要进行的比较次数与初始状态下待排序的记录序列的排列情况无关。当i=1时,需进行n-1次比较;当i=2时,需进行n-2次比较;依次类推,共需要进行的比较次数是∑ =(n-1)+(n-2)+…+2+1=n(n-1)/2,即进行比较操作的时间复杂度为O(n2)。
  • 相关阅读:
    python hmac解密
    pymongo加索引以及查看索引例子
    语音-数字中继-E1-学习帖
    Partition does not start on physical sector boundary
    吃自助餐怎么样一个顺序吃法才合算?
    关于ROS证书导入的步骤
    MikroTik-ROS-无线设备传输距离
    这个移动通讯中 DB 、DBm 、瓦的基本知识的问题:
    涨姿势 | 无线通讯距离现场评估知多少?
    linux下生成https的crt和key证书
  • 原文地址:https://www.cnblogs.com/woaiheniunai/p/5987644.html
Copyright © 2011-2022 走看看