插入排序、交换排序

本文详细介绍了排序的基本概念,包括稳定性和内外排序的定义。重点讲解了插入排序,包括直接插入排序和希尔排序,以及它们的时间复杂度。此外,还探讨了交换排序,如冒泡排序和快速排序的原理与效率。通过实例展示了各种排序算法的操作过程。
摘要由CSDN通过智能技术生成

一、排序的基本概念 

所谓排序,是要整理表中的记录,使之按关键字递增(或递减)有序排列。

其确切定义如下:

输入:n个记录,R0,R1,…,Rn-1,其相应的关键字分别为k0,k1,…,kn-1。

输出:Ri,0,Ri,1,…,Ri,n-1,使得ki,0≤ki,1≤…≤ki,n-1 (或ki,0≥ki,1≥…≥ki,n-1)。

算法的稳定性

待排序记录的关键字均不相同时排序的结果是惟一的,否则排序的结果不一定唯一。

如果待排序的表中,存在有多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,则称这种排序方法是稳定的;反之,若具有相同关键字的记录之间的相对次序发生变化,则称这种排序方法是不稳定的。    

内排序和外排序

在排序过程中,若整个表都是放在内存中处理排序时不涉及数据的内、外存交换,则称之为内排序;反之,若排序过程中要进行数据的内、外存交换,则称之为外排序。 

正序和反序

若待排序的表中元素已按关键字排好序,称此表中元素为正序;反之,若待排序的表中元素的关键字顺序正好和排好序的顺序相反,称此表中元素为反序

内排序方法的比较


待排序的顺序表类型的类型定义如下:

typedef int KeyType;    //定义关键字类型
 typedef struct          //记录类型
 {  KeyType key;         //关键字项
    InfoType data;       //其他数据项,类型为InfoType

 } RecType;              //排序的记录类型定义 


二、插入排序

插入排序的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子表中的适当位置,直到全部记录插入完成为止。

两种插入排序方法:

(1)直接插入排序(含二分插入排序)

(2)希尔排序

1.直接插入排序

假设待排序的记录存放在数组R[0..n-1]中,排序过程的某一中间时刻,R被划分成两个子区间R[0..i-1]和R[i..n-1],其中:前一个子区间是已排好序的有序区后一个子区间则是当前未排序的部分,不妨称其为无序区

直接插入排序的基本操作是将当前无序区的第1个记录R[i]插入到有序区R[0..i-1]中适当的位置上,使R[0..i]变为新的有序区。

这种方法通常称为增量法,因为它每次使有序区增加1个记录。      

void InsertSort(RecType R[],int n) 
//对R[0..n-1]按递增有序进行直接插入排序
{  int i,j; RecType temp;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值