排序算法积累

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

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

问题分析和总体设计

ADT OrderableList{
           数据对象:D={ai| ai∈IntegerSet,i=1,2,…,n,n≥0}
           数据关系:R1={〈ai-1,ai〉|ai-1, ai∈D, i=1,2,…,n}
           基本操作:
InitList(n)
  操作结果:构造一个长度为n,元素值依次为1,2,…,n的有序表。
Randomizel(d,isInverseOrser)
  操作结果:随机打乱
BubbleSort( )
  操作结果:进行起泡排序
InserSort( )
  操作结果:进行插入排序
SelectSort( )
  操作结果:进行选择排序
QuickSort( )
  操作结果:进行快速排序
HeapSort( )
  操作结果:进行堆排序
ListTraverse(visit( ))
  操作结果:依次对L种的每个元素调用函数visit( )
         }ADT  OrderableList

待排序表的元素的关键字为整数.用正序,逆序和不同乱序程度的不同数据做测试比较,
对关键字的比较次数和移动次数(关键字交换计为3次移动)进行测试比较.
要求显示提示信息,用户由键盘输入待排序表的表长(100-1000)和不同测试数据的组数(8-18).每次测试完毕,要求列表现是比较结果.
要求对结果进行分析.

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

bubblesort(struct rec r[],int n)
{
int i,j;
struct rec w;
unsigned long int compare=0,move=0;
for(i=1;i<=n-1;i++)
  for(j=n;j>=i+1;j--)
   {
    if(r[j].key<r[j-1].key)
     {
     w=r[j];
     r[j]=r[j-1];
     r[j-1]=w;
     move=move+3;
     }
    compare++;
   }
printf("/nBubbleSort compare= %ld,move= %ld/n",compare,move);
}


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(1≤j≤i-1),使得L[j] ≤L[j+1]时为止

insertsort(struct rec r[],int n)
{
int i,j;
unsigned long int compare=0,move=0;
for(i=2;i<=n;i++)
   {compare++;
    r[0]=r[i];
    move++;
    j=i-1;
   while(r[0].key {r[j+1]=r[j];
j--;
move++;
++compare;}
   r[j+1]=r[0];
   move++;
   }
  printf("/nInsertSort compare= %ld,move= %ld/n",compare,move);
}


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

selectsort(struct rec r[],int n)
{
unsigned long int compare=0,move=0;
int i,j,k;
struct rec w;
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; compare++; }
     w=r[i];
     r[i]=r[k];
     r[k]=w;
     move=move+3;

     }
}
printf("/nSelectSort compare= %ld,move= %ld/n",compare,move);
}


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


q(struct rec r[],int s,int t)
{
int i=s,j=t;
if(s<t)
{
  r[0]=r[s];    ++a;  c++;
  do{
while(j>i&&r[j].key>=r[0].key)
   {j--;
    ++a; }
if(i<j)
{ r[i]=r[j];
   i++;
   c++; }
while(i<j&&r[i].key<=r[0].key)
   {i++;
    ++a; }
if(i<j)
   { r[j]=r[i];
     j--;
     c++; }
    } while(i<j);
r[i]=r[0];
c++;
q(r,s,j-1);
q(r,j+1,t);
}
}


5. 堆排序
(1) 基本思想:
  堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。
(2) . 堆的定义: N个元素的序列K1,K2,K3,...,Kn.称为堆,当且仅当该序列满足特性:
       Ki≤K2i Ki ≤K2i+1(1≤ I≤ [N/2])


sift(struct rec r[],int l,int m)
{
int i,j;
struct rec w;
i=l; j=2*i;
w=r[i];
while(j<=m)
{
  if(j<m&&r[j].key<r[j+1].key)  { j++;
  }
  if(w.key<r[j].key)
  {
   r[i]=r[j];
   i=j;
   j=2*i;
   }
  else j=m+1;
  }
  r[i]=w;
}

heapsort(struct rec r[],int n)
{
  unsigned long int compare=-1,move=-1;
  struct rec w;
  int i;
  int a;
  for(i=n/2;i>=1;i--) a=sift(r,i,n);
  compare++;
  move++;

  for(i=n;i>=2;i--)
  {
    w=r[i];
    r[i]=r[1];
    r[1]=w;
    a=sift(r,1,i-1);
    compare+=a;
    move+=a;
   }
}


小结:
    1.学会使用随机函数randomize( ) 为数组赋初值要在头文件中添加#include
    2.在做此程序之前基本上是在理解了各种排序过程以后完成的
    3.对排序算法的总结:
(1)若n较小(如n≤50),可采用直接插入或直接选择排序。
     当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。
(2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜;
(3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。
     快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;
     堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。这两种排序都是不稳定的。

内部排序算法比较(超详解) 一、题目描述 通过随机数据比较各排序算法的关键字比较次数和关键字移动次数,以 及执行间,取得直观感受。 二、设计要求一、需求分析 实现各排序算法,分别进行以下各组比较,并进行总结。 一、各算法在不同规模下的比较。 1)比较范围:直接插入排序、冒泡法排序、简单选择排序、快速排序1(自己实现)、快速排序2(调用STL)、归并排序。 2)比较指标:a)关键字操作次数(比较次数和移动次数 阅读详情

相关推荐

技术知识的积累与应用

本文将对书籍中关于技术知识积累与应用的章节内容进行解读。通过对序列、算术、几何等基本数学概念的梳理,以及对排序算法数据结构、程序设计等计算机科学核心概念的探讨,读者将获得对知识积累重要性的认识,并了解到如何将理论知识应用于实际问题解决。

weixin_42499004的博客 204

数据结构各内部排序算法总结对比及动图演示(插入排序、冒泡和快速排序选择排序、堆排序、归并排序和基数排序等)

介绍算法的执行过程、算法可视化演示、算法代码、对比总结

z135733的博客 4803

数据结构(python) —— 【15: NB三人组小结】

快速、堆、归并排序小结 之前讲了Low B三人组,然后最近又讲了NB三人组的快速排序、堆排序和归并排序数据结构(python) —— 【08排序: 快速排序数据结构(python) —— 【11: 堆排序数据结构(python) —— 【14: 归并排序】 其中堆排序可能比较难理解,需要花费更多间去结合图文进行理解。今天来把这三个排序进行小结一下。 三种排序算法间复杂度都是O(nlog(n)) 一般情况下,就运行间而言: 快速排序 < 归并排序 < 堆排序 三种排序算法的缺

土豆同学的博客 517

内部排序算法比较-数据结构C语言课设

(1)对以下7中常会用的内部排序算法进行比较:冒泡排序直接插入排序、简单选择排序、希尔排序、堆排序、归并排序、快速排序。(2)待排序表的表不小于2000;比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换计为3次)。(3)最后要对结果做出简单分析,包括对各组数据得出结果波动大小的解释。在教科书中,各种内部排序算法间复杂的分析结果只给出了算法执行间的阶,或大概执行间。试通过随机数据比较各种算法的关键字比较次数和关键字移动次数,以取得直观感受。人狠话不多,直接上代码!

你们de4月天的博客 6245

内部排序算法之比较排序(一)

内部排序算法指的是数据记录在内存中的排序,通常分为两类:比较排序和非比较排序,接下来主要介绍以下常用几个比较排序算法。冒泡排序基本思想:“轻者上浮,重者下沉”;一趟冒泡的过程:从最左或(最右)侧开始依次比较相邻两个元素大小,每次比较的两个元素记为left,right,若right&lt;left则互换两个元素的值,反之继续向另一侧移动,重复上面的比较,直到到达另一侧;每一趟比较都会有一个元素到达最...

wxb247217的博客 1294

各种排序算法积累

自己动手吃透。明天补上

TonyHelloWorld的博客 378

知识积累--常见排序算法

选择排序 public static void selectSort(int []a){ int i,j; int temp=0,flag=0; int n=a.length; for(i=0;i<n;i++){ temp=a[i]; flag=i; for(j=i+1;j<n;j++){ if(a[j]<temp){ t...

qq_38485279的博客 195

常见排序算法 积累中.........

1.插入排序 插入排序可以看做是,在一个已经有序的序列中在插入一个,使得它还是有序的。 简单的实现: public int[] insertSort(int a[]) { int temp , j; //一次大的循环 for (int i = 0; i j = i + 1; temp = a[j]; //在j以前的数据都是有序的,然后将j插入到此有序的序列中 for(;

yinzhuo1的专栏 731

排序算法积累(3)-----快速排序

一. 快速排序思路   1. 快速排序首先在所需要排序的数据中随机地选出一个数作为阀值,并把这个数(也就是这个阀值)与原来数据中最后的一个数交换,到了这步,数据中最后的一个数就是这个阀值了。   2. 然后从头开始,将数据一个一个地与这个阀值作比较,小于这个阀值的数,放在左边,等于这个阀值的数不用理,大于这个阀值的数放在右边,这样就可以将数据分成小于等于大于三个    区间了。注意每个...

weixin_30786617的博客 90

排序算法积累(1)-----冒泡排序,插入排序,选择排序

#include<iostream> #include<string> #include<math.h> #include <cstddef> #include<stack> //出入栈头文件 using namespace std; void swap(int arr[], int i, int j); v...

weixin_30455067的博客 77

累!!

<br />今天上班有点累,在公司整了一天单元测试,不停的打桩,写测试例,测试,写的头都大了,最郁闷的事才发现1个bug,感觉效率很低啊。单元测试方法还有待加强~!<br /> <br />晚上十点回到家,环境基本搭建好了,开始把一些基本的库都整理一下,从排序算法开始吧。。。。,明天把冒泡算法代码贴上来,哈哈,很简单吧,慢慢来吧!!!呵呵。应该是要自己慢慢积累一些东西了,工作两年了,感觉进步太慢了,还是自己不够努力,得过且过。。<br /> <br />明天继续~fighting!!!

robbie1314的专栏 480

2020 PAT甲级春季考试解题报告(满分)

前言        刷了不到20道真题就去考PAT了(勇士精神 )。话说13点30分对于午觉党来说真的不太友好,很容易犯食困。。。 题解 第一题 给你一个日期字符串,判断所有后缀字符串对应的数字是否是素数。暴力模拟一下即可。 #include<bits/stdc++.h> using namespace std; typedef long long ll; ll d[20], cnt = 0; bool ans[20];

尧fighting的博客 5369

排序算法积累(4)-------归并排序

一、归并排序思路   大体思路就是将数据在中位数的位置分成两个区间,一直重复,直到最后节点只有一个数    二、程序    #include <iostream> #include <iomanip> #include <string> //用setprecision(n)设置精度,其中n表示精确到小数点后n位 using ...

weixin_30298497的博客 88

一步搞定你疑惑的数据结构算法系列,原理+实战讲解

前言 假如你去面试,面试官让你聊一下对索引的理解,然而你对索引的理解仅限于,检索数据就是快,是一种数据结构这个层面,那你就只能回家等通知了。 为了避免这种尴尬的事情发生,咔咔用两天将索引的内容在自己理解的范围内进行了整理,如有整理不全面的地方可以在评论区进行补充和提建议。 蚂蚁金服一面: 下午杭州的电话,问有没有空,果断有空,虽然感觉略显紧张,有点懵逼。 面试的题目: HashMap和Hashtable的区别 实现一个保证迭代顺序的HashMap 说一说排序算法,稳定性,复杂度 说一说GC 可以保证的实

m0_57066131的博客 124

封装个人积累的Tool工具插件(vue)——JavaScript排序算法~~冒泡排序选择排序,插入排序,希尔排序,归并排序,堆排序,快速排序

1.新建一个tool.js文件,写入如下代码,放入 plugins 文件夹内 const tool = {} // 数组排序 (冒泡排序) 方法1 // *简明解释* // 通过依次比较、交换相邻的元素大小(按照由小到大的顺序,如果符合这个顺序就不用交换)。 // 1次这样的循环可以得到一个最大值,n - 1 次这样的循环可以排序完毕。 // *属性* // 1.稳定 /...

人间草木 406

【博客之星】沧海一粟,星河长明:以代码之匙探寻技术的诗与远方

在技术的疆域中,每一次键盘的敲击都是对未知世界的追问,每一段代码的书写都映射着思想的轨迹。从初识编程到技术创作,这段旅程如同跋涉于星空与沙漠之间,每一步都留下成长的痕迹。从第一篇拙作到荣获CSDN 1024程序员节征文大赛第一名,我用文字记录思想,用代码承载初心。技术不只是工具,更是认知世界的桥梁;成长不仅是进步,更是灵魂的历练。让我们在技术的诗意中,追寻无尽的远方,在探索中发现更宽广的自我。

半截诗的博客~ 2569

小白想学C语言懵逼中?我告诉你撸就完事了!

为了你们淦出来的,你还不给个三连? 怎么你是那个说自己是萌新的小白吗?你点进来了,别装了,你肯定是!我猜你关注了那个大神教小白学编程的博客,还关注了别的写《小白入门指南》的博主,今天你看到了我的这篇文章,我猜你肯定会点赞、评论加关注,素质三连,我先提前谢谢小萌新了。 为什么说“撸”就完事了! 给你定个小目标,本科期间自己写的代码至少超过两万行,github搞起来,这都是在攒钱,而且不需要...

lyztyycode的博客 9688

最新python相关的面试题(测试开发方向)

2019年夏天,我从北京来到了成都,工作并不好找,面试了两个月,干货都在这里了。 必考面试题 ????如何去除列表中的重复元素 ????八大排序算法合集 ????斐波那契数列的python实现 ????如何对字符串进行反转 如何对单词反转 统计字符串中每个字母出现的次数 对某英文文章的单词,进行词数统计 python的字典合并 python的赋值、浅拷贝和深拷贝的区别 ????返回字符串中第一个不重复的字母和位置 经常会问...

1262

第05章 数组 07 练习5

鱼欲遇雨:每日都学习一点,持之以恒,天道酬勤!不能用电脑,提前补上!(2012.9.6) ------------------------------------------------------------------------------   - 排序算法问题         ----------------------------------------------

jinhongliang123的专栏 365
上一篇: VB中用API实现字体公用对话框例子
wanghome
博客等级 码龄23年 0粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值