`
luozhong915127
  • 浏览: 186256 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
文章分类
社区版块
存档分类
最新评论
阅读更多

排序算法是数据结构学科经典的内容,其中内部排序现有的算法有很多种,究竟各有什么特点呢?本文力图设计实现常用内部排序算法并进行比较。分别为起泡排序,直接插入排序,简单选择排序,快速排序,堆排序,针对关键字的比较次数和移动次数进行测试比较。

 

  问题分析和总体设计

 

ADT OrderableList

{

          

数据对象:D={ai| aiIntegerSet,i=1,2,,n,n0}

          

数据关系:R1={ai-1ai|ai-1, aiD, i=1,2,,n}

 

1、起泡排序

 

   算法:核心思想是扫描数据清单,寻找出现乱序的两个相邻的项目。当找到这两个项目后,交换项目的位置然后继续扫描。重复上面的操作直到所有的项目都按顺序排好。

//冒泡排序函数

void bsort::bubblesort(double *y, int m)

{

   for(i=(m-1);i>0;i--)

   {

       flag=0;

       for(j=1;j<=i;j++)

       {

           if(y[j-1]>y[j])

           {

              temp=y[j-1];

              y[j-1]=y[j];

              y[j]=temp;

              flag=1;

           }

       if(flag==0) break;           

       }                

                      

   }

 

 

2、直接插入排序

 

算法:经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]的适当位置,使得L[1..i]又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较L[i]L[i-1],如果L[i-1] L[i],则L[1..i]已排好序,第i遍处理就结束了;否则交换L[i]L[i-1]的位置,继续比较L[i-1]L[i-2],直到找到某一个位置j(1ji-1),使得L[j] L[j+1]时为止。

//插入排序函数

void isort::insertion_sort(double *x, int m)

{

   for(i=1;i<m;i++)

   {

      temp=x[i];

      j=i;

      while((j>0)&&(x[j-1]>temp))

      {

          x[j]=x[j-1];

          j--;

      }

      x[j]=temp;

                      

   }   

 

3、简单选择排序

 

  算法:首先找到数据清单中的最小的数据,然后将这个数据同第一个数据交换位置;接下来找第二小的数据,再将其同第二个数据交换位置,以此类推。

//shell排序函数

void ssort::shell_sort(double *x, int m)

{

   h=3;

   while(h>0)

   {

     

       for(i=1;i<m;i++)

       {

          temp=x[i];

          j=i;

          while((j>=h)&&(x[j-h]>temp))

         {

          cout<<"排序成功"<<endl;                          

          x[j]=x[j-h];

          j-=h;

         }

         x[j]=temp;

                      

      }

      if((h/2)!=0) {h/=2;}

      else if(h==1) {h=0;}

      else{h=1;}

   }   

 

 

4、快速排序

 

  算法:首先检查数据列表中的数据数,如果小于两个,则直接退出程序。如果有超过两个以上的数据,就选择一个分割点将数据分成两个部分,小于分割点的数据放在一组,其余的放在另一组,然后分别对两组数据排序。通常分割点的数据是随机选取的。这样无论你的数据是否已被排列过,你所分割成的两个字列表的大小是差不多的。而只要两个子列表的大小差不多。

//快速排序函数

void quicksort1::quicksort(double *x, int left, int right)

{

   l_h=left;

   r_h=right;

   pivot=x[left];

   while(left<right)

   {

       while((x[right]>=pivot)&&(left<right))

       {

          right--;  

       }

       if(left!=right)

       {

          x[left]=x[right];

          left++;

       }

       while((x[right]<=pivot)&&(left<right))

       {

          left++;  

       }

       if(left!=right)

       {

          x[right]=x[left];

          right--;

       } 

      

   }

   x[left]=pivot;

   pivot_loc=left;

   left=l_h;

   right=r_h;

   if(left<pivot_loc){quicksort(x, left, (pivot_loc-1));} 

   if(right>pivot_loc){quicksort(x,(pivot_loc+1),right);}

}

3
2
分享到:
评论

相关推荐

    几种常见排序算法代码

    几种常见的排序算法代码,附有其效率及分析

    各种排序算法说明及代码示例(图示)

    在计算机科学与数学中,排序算法是一种基本并且常用的算法,一个排序演算法是一种能将一串资料依照特定排序方式的一种演算法。有效的排序演算法在一些演算法中是重要...现介绍C/C++中几种常见排序算法的简单运用方法。

    222018321062006宋行健 实验一1

    2. 掌握常见的几种排序算法的基本思想方法 3. 对问题实例运用不同的排序算法进行求解,并能比较不同方法的效率好坏和适用的应用场景 4. 设计并实现排序算法 2

    C语言进阶-牟海军.pdf

    第11章则对所有程序员必须掌握的几种算法进行了详细的讲解;附录经验性地总结了如何养成良好的编码习惯,这对所有开发者都尤为重要。 本书主要内容:  堆和栈、全局变量和局部变量、生存期和作用域、内部函数和...

    C语言进阶 作者 Wrestle.Wu

    第11章则对所有程序员必须掌握的几种算法进行了详细的讲解;附录经验性地总结了如何养成良好的编码习惯,这对所有开发者都尤为重要。 本书主要内容:  堆和栈、全局变量和局部变量、生存期和作用域、内部函数和...

    MYSQL常用命令大全

    MYSQL常用命令 1.导出整个数据库 mysqldump -u 用户名 -p --default-character-set=latin1 数据库名 &gt; 导出的文件名(数据库默认编码是latin1) mysqldump -u wcnc -p smgp_apps_wcnc &gt; wcnc.sql 2.导出一个表 ...

    Hadoop硬实战 [(美)霍姆斯著][电子工业出版社][2015.01]_PDF电子书下载 带书签目录 高清完整版.rar )

    8.1 比较R 和MapReduce 集成的几种方法 8.2 R 基础知识 8.3 R 和Streaming 8.3.1 Streaming 和map-only R 技术点57 计算股票日平均值 8.3.2 Streaming、R 和完整的MapReduce 技术点58 计算股票的...

    Hadoop实战(第2版)

    join 7.3 本章小结8 结合R 和Hadoop 进行数据统计8.1 比较R 和MapReduce 集成的几种方法8.2 R 基础知识 8.3 R 和Streaming 8.3.1 Streaming 和map-only R 技术点57 计算股票日平均值8.3.2 Streaming...

    菜鸟也会数据分析.pptx

    数据分析概述 1 数据分析常见问题 2 3 CONTENTS 数据分析六部曲 4 常用指标及术语 菜鸟也会数据分析全文共22页,当前为第2页。 数据分析概述 1 菜鸟也会数据分析全文共22页,当前为第3页。 何谓数据分析? what ...

    2009达内SQL学习笔记

    ORDER BY子句中使用的列将是为显示所选择的列,但是实际上并不一定要这样,用非检索的列排序数据是完全合法的。 为了按多个列排序,列名之间用逗号分开。 2、支持按相对列位置进行排序。 输入 SELECT prod_id,...

    计算机二级公共基础知识

    一种数据的逻辑结构根据需要可以表示成多种存储结构,常用的存储结构有顺序、链接等存储结构。 顺序存储方式主要用于线性的数据结构,它把逻辑上相邻的数据元素存储在物理上相邻的存储单元里,结点之间的关系由存储...

    SQL语法大全

    以上几个游标类型将直接影响到Recordset对象所有的属性和方法,以下列表说明他们之间的区别。 ------------------------------------------------------------- Recordset属性 adOpenForwardOnly adOpenKeyset ...

    并行计算课程设计(报告+代码+可执行文件)

    在系统中实现了对机票信息的增删改查,考虑到查询的方便性,对机票按照航班号进行排序,而此排序方法用并行快速排序运用进来。利用OpenMP的并行技术,对机票信息按顺序排列好,并分析了实验过程中的加速比。 4.6.2 ...

    并行计算课程设计(代码+执行文件+文档)

    在系统中实现了对机票信息的增删改查,考虑到查询的方便性,对机票按照航班号进行排序,而此排序方法用并行快速排序运用进来。利用OpenMP的并行技术,对机票信息按顺序排列好,并分析了实验过程中的加速比。 4.6.2 ...

    Java范例开发大全 (源程序)

    第1篇 Java编程基础  第1章 Java开发环境的搭建(教学视频:9分钟)... 13.1 多线程的五种基本状态 405  实例222 启动线程 405  实例223 参赛者的比赛生活(线程休眠唤醒) 407  实例224 资源搜索并下载(线程...

    java范例开发大全(pdf&源码)

    13.1 多线程的五种基本状态 405 实例222 启动线程 405 实例223 参赛者的比赛生活(线程休眠唤醒) 407 实例224 资源搜索并下载(线程等待和通报) 410 实例225 模拟淘宝购物买卖双方交易问题 412 实例226 携子之手 ...

    java范例开发大全源代码

     实例4 常用基础类型之强制转换 11  2.2 运算符 12  实例5 算术运算符 12  实例6 关系运算符 13  实例7 逻辑运算符 14  实例8 位运算符 15  实例9 移位运算符 16  实例10 转型运算符 17  ...

    asp.net知识库

    常用的匹配正则表达式和实例 经典正则表达式 delegate vs. event 我是谁?[C#] 表达式计算引擎 正式发布表达式计算引擎WfcExp V0.9(附源码) 运算表达式类的原理及其实现 #实现的18位身份证格式验证算法 身份证15To18...

    java范例开发大全

    13.1 多线程的五种基本状态 405 实例222 启动线程 405 实例223 参赛者的比赛生活(线程休眠唤醒) 407 实例224 资源搜索并下载(线程等待和通报) 410 实例225 模拟淘宝购物买卖双方交易问题 412 实例226 携子之手 ...

Global site tag (gtag.js) - Google Analytics