数据结构-排序

目录

一、插入排序

1、直接插入排序

2、折半插入排序

3、希尔排序

二、交换排序

1、冒泡排序

2、快速排序

三、选择排序

1、简单选择排序

2、堆排序

四、归并排序

五、基数排序

一、插入排序

1、直接插入排序

将一组数据分为有序区和无序区,依此将无序区的记录插入到有序区中。

已知关键字序列{75,68,87,92,88,61,80,72}

平均时间复杂度O(n^2)

空间复杂度O(1)

2、折半插入排序

也叫作二分插入排序

折半插入算法是对直接插入排序算法的改进,排序原理同直接插入算法。

 已知关键字序列{75,68,87,92,88,61,80,72}

 平均时间复杂度O(n^2)

 空间复杂度O(1)

3、希尔排序

将数据分组,将每一组进行插入排序,每一组排成有序后,最后整体就变有序。

 已知关键字序列{75,68,87,92,88,61,80,72}

平均时间复杂度约为O(n^1.3)

空间复杂度O(1)

二、交换排序

1、冒泡排序

依次比较两个数的大小,如果与所需顺序不同则交换。

 已知关键字序列{75,68,87,92,88,61,80,72}

 平均时间复杂度O(n^2)

 空间复杂度O(1) 

2、快速排序

对无序的序列进行比较和划分,分成的两个序列再进行比较划分,直到全部有序。

单趟排序的思路是:取区间中最左或最右边的元素为key,定义两个变量,这里假设是p和q,q从区间的最右边向左走,找到比key小的元素就停下。p从最左边向右走,找到比key大的元素就停下。

已知关键字序列{75,68,87,92,88,61,80,72}

 时间复杂度O(nlogn)

 空间复杂度O(nlogn)

三、选择排序

1、简单选择排序

选出最小的/最大的放在首位,剩下的再选最小/大的放在第二个,直到排序完成。

已知关键字序列{75,68,87,92,88,61,80,72}

 时间复杂度O(n^2)

 空间复杂度O(1)

2、堆排序

将带排序的序列构造成一个大根堆(小根堆),将堆顶元素和最后一个元素交换,然后将剩下的节点重新构造成一个大根堆,如此反复,从第一次构建大根堆(小根堆)开始,每一次构建,我们都能获得一个序列的最大值(最小值)并把它放到大根堆(小根堆)的尾部。直至排序完成。

已知关键字序列{75,68,87,92,88,61,80,72}

   

构建大根堆:

将最大元素和最后一位互换位置,得到新的堆:

 

 最后一位固定,其余元素继续进行构建大根堆:

 此时88与80交换位置,得到:

 反复执行构造大根堆,交换堆顶元素与末尾元素位置两步,直到所有元素都固定:

 此时得到的序列{61,68,72,75,80,87,88,92}即为所需要的序列。

 平均时间复杂度O(nlogn)

 空间复杂度O(1) 

四、归并排序

多次将两个或两个以上的有序表合成一个新的有序表。通常采用二路归并排序。

已知关键字序列{75,68,87,92,88,61,80,72}

 平均时间复杂度O(nlogn)

 空间复杂度O(n)

五、基数排序

有两种基数排序:最低位优先LSD,最高位优先MSD

先按照最低(高)位的值进行记录排序,在此基础上按次低(高)位进行,直到全部位数完成。

已知关键字序列{757,648,387,292,488,761,280,72}

 时间复杂度O(d(n+r))         d为分配的趟数,r为基数 分配为O(n) 收集为O(r)

 空间复杂度O(r)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值