(C)排序

方法分类:

内部排序:在内存中进行,适于小文件  

外部排序:使用内存和外存,适于大文件,内存不够用

1.直接插入排序:

å¨è¿éæå¥å¾çæè¿°

将前n位看做一个有序序列,n+1位插入时,先从n位往前遍历,直到找到比n+1位小的数,此数后的数都往后移一位,将n+1插到此数后面,此时前n+1位为有序序列,重复此操作。

2.希尔排序:

1.先选定一个小于N的整数gap作为第一增量,然后将所有距离为gap的元素分在同一组,并对每一组的元素进行直接插入排序。然后再取一个比第一增量小的整数作为第二增量,重复上述操作…
2.当增量的大小减到1时,就相当于整个序列被分到一组,进行一次直接插入排序,排序完成。

3.选择排序

 每次从待排序列中选出一个最小值,然后放在序列的起始位置,直到全部待排数据排完即可。
实际上,我们可以一趟选出两个值,一个最大值一个最小值,然后将其放在序列开头和末尾,这样可以使选择排序的效率快一倍。

4.冒泡排序

å¨è¿éæå¥å¾çæè¿°

左边大于右边交换一趟排下来最大的在右边 

5.快速排序

å¨è¿éæå¥å¾çæè¿°

1、选出一个key,一般是最左边或是最右边的。
2、定义一个begin和一个end,begin从左向右走,end从右向左走。(需要注意的是:若选择最左边的数据作为key,则需要end先走;若选择最右边的数据作为key,则需要bengin先走)。
3、在走的过程中,若end遇到小于key的数,则停下,begin开始走,直到begin遇到一个大于key的数时,将begin和right的内容交换,end再次开始走,如此进行下去,直到begin和end最终相遇,此时将相遇点的内容与key交换即可。(选取最左边的值作为key)
4.此时key的左边都是小于key的数,key的右边都是大于key的数
5.将key的左序列和右序列再次进行这种单趟排序,如此反复操作下去,直到左右序列只有一个数据,或是左右序列不存在时,便停止操作,此时此部分已有序
 

6.归并排序

å¨è¿éæå¥å¾çæè¿°

 首先为左子序列附设一个指针 left 指向左子序列的第一个元素,为右子序列附设一个指针 right 指向右子序列的第一个元素;
附设一个临时数组 temp 用于临时存储排序后的结果;
右子序列的指针 right 向右移动,在移动的过程中如果指向的元素小于 left 指向的元素,则将 arr[right] 记录在临时数组 temp 中;
若右子序列的指针 right 移动过程指向的元素大于 left 指向的元素,则将 arr[left] 追加到临时数组 temp 中;
左子序列的指针 left 再向右移动,若移动过程中指向的元素小于 right 指向的元素,则将 arr[left] 追加到 temp 中;
若左子序列的指针 left 向右移动过程中指向的元素大于 right 指向元素,则将 arr[right] 追加到 temp 中;
循环执行 3~6步,直到其中一个子序列中的元素都被记录完毕;然后将尚存在元素的子序列按顺序追加在 temp 数组中,
将 temp 数组中的元素复制到原序列 arr 中,则两个有序子序列的合并正式完成。
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值