方法分类:
内部排序:在内存中进行,适于小文件
外部排序:使用内存和外存,适于大文件,内存不够用
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 中,则两个有序子序列的合并正式完成。