• 第九周数据结构


    选择排序

    每一趟在n-i+1 (i=1, 2,....n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。
    第1趟简单选择排序时,从第1个记录开始,通过n-1次关键字的比较,从n个记录中选出关键字最小的记录,并和第1个记录进行交换。
    第2趟简单选择排序时,从第2个记录开始,通过n-2次关键字的比较,从n-1个记录中选出关键字最小的记录,并和第2个记录进行交换。
    第i趟简单选择排序时,从第i个记录开始,通过n-i次关键字的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录进行交换。
    如此反复,经过n-1趟简单选择排序,将把n-1个记录排到位,剩下一个最小记录直接在最后,所以共需进行n-1趟简单选择排序。




     void SelectSort(RecordType r[], int length)
    /*对记录数组r做简单选择排序,length 为数组的长度*/
    n=length; .
    for(i=1;i<=n一1 ;++i)
    {
    k=i;
    for (j=i+1;j<=n; ++j)
    if (r[j].key< r[k].key) k=j;
    if ( k!=i)
    {x=r[i]; r[j]=r[k]; r[k]=x;}
    }/* SelectSort */

    冒泡排序
    冒号排序是一种简单的交换类排序方法,它是通过相邻的数据元素的交换,逐步将待排序序列变成有序序列的过程。
    [算法思想]反复扫描待排序记录序列,在扫描的过程中顺次比较相邻的两个元素的大小,若逆序就交换位置。
    以升序为例:在第- -趟冒泡排序中,从第-一个记录开始,扫描整个待排序记录序列,若相邻的两个记录逆序,则交换位置。
    在扫描的过程中,不断地将相邻两个记录中关键字大的记录向后移动,最后必然将待排序记录序列中的最大关键字记录换到待排序记录序列的末尾,这也是最大关键字记录应在的位置。
    然后进行第二趟冒泡排序,对前n-1个记录进行同样的操作,其结果是使次大的记录被
    放在第n-1个记录的位置上。然后进行第三趟冒泡排序,对前n-2个记录进行同样的操作,其结果是使第三大的记录被放在第n-2个记录的位置上。
    如此反复,每一趟冒泡排序都将一个记录排到位,直到剩下一个最小的记录。
    若在某一趟冒泡排序过程中,没有发现一个逆序,则可直接结束整个排序过程,所以冒泡过程最多进行n-1趟。

     

     

     void  BubbleSort(RecordType r[], int length )
    /*对记录数组r做冒泡排序,length 为数组的长度*/
    n=length; .
    change=TRUE;
    for(i=1 ;i<= n-1 && change ;++i )
    {
    change=FALSE;
    for(j=1;j<= n-i; ++j)
    if (rlj].key> r[j+1].key)
    {
    x= r[j];
    r[j]= r[j+1];
    r[j+1]= x;
    change=TRUE;
    }
    }/*
    BubbleSort */



    归并排序

    [算法思想]假设初始序列含有n个记录,首先将这n个记录看成n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2长度为2 (n为奇数时,最后一个序列的长度为1)
    的有序子序列;在此基础上,再对长度为2的有序子序列进行两两归并,得到若干个长度为4的有序子序列;如此重复,直至得到一个长度为n的有序序列为止。这种方法被称作2-路归并排序。

    void Merge ( RecordType r1[],int low,int mid, int high, RecordType r2[])
    /*已知r1[low..mid]和rl[mid+..high]分别按关键字有序排列,将它们合并成一个有序
    序列,存放在r2[low..high] */
    i=low; j=mid+1; k=low;
    while ( (i<=mid)&&(j<=high) )
    {
    if( rl[i].key<=r1[j].key )
    r2[k]=r1[i] ; ++i;
    else
    r2[k]=r1[j] ; ++j;
    ++k ;
    while( i<=mid )
    {r2[k]=r1[i];k++,i++;}
    while( j<=high);
    { r2[k]=r1[j];k++;j++;}
    } /* Merge */
    从算法的平均时间复杂度、最坏时间复杂度以及算法所需的辅助存储空间三方面,各种排序方法加以比较,如表所示。其中简单排序法包括直接插入排序、冒泡排序和简单选择排序等。






  • 相关阅读:
    jquery实现记住用户名和密码
    从mysql8.0.15升级到8.0.16
    mysql8.0.15二进制安装
    DML、DDL、DCL的分别是什么
    redis3.2.10单实例安装测试
    redis5.0.3单实例简单安装记录
    percona-xtrabackup快速安装及其简单使用
    pt-show-grants的用法
    Centos6安装Percona-tools工具
    sshpass-Linux命令之非交互SSH密码验证
  • 原文地址:https://www.cnblogs.com/juyuanyuan/p/13152071.html
Copyright © 2020-2023  润新知