排序--插入排序
上学的时候学数据结构,没有意识到它的重要性,而如今工作了,也积累了一些项目经验,回过头来再看数据结构,才感觉出那看似“基础”的知识,其中蕴含着最简单,也最深刻的道理,所以打算重新系统得复习一下,在此写的文章就算是自己的复习笔记了。
今天先从排序开始复习,我所了解的排序有内排序和外排序之分,假如整个排序过程不需要访问外存的话便能实现排序,则此类排序称为内排序,反之,若参加排序的记录数非常大,内存是无法容纳这些记录的,就得需要外部存储设备来进行排序,则称此类排序为外部排序。
学习数据结构最重要的是掌握它的一些思想精华,排序算法就很有代表性,排序算法大致可分为:插入排序,选择排序,交换排序,归并排序等。今天首先来复习插入排序,插入排序的主要思想是不断地将待排序的元素插入到有序序列中,使有序序列不断扩大,直至所有元素都被插入有序序列中。插入排序算法比较典型的有直接插入排序和希尔排序。
https://www.wenjuan.com/z/A7BNFza
https://www.wenjuan.com/s/IFbIf2G/
https://www.wenjuan.com/s/IFbIf2G
https://www.wenjuan.com/z/IFbIf2G/
https://www.wenjuan.com/z/IFbIf2G
https://www.wenjuan.com/s/uueEfqt/
https://www.wenjuan.com/s/uueEfqt
https://www.wenjuan.com/z/uueEfqt/
https://www.wenjuan.com/z/uueEfqt
https://www.wenjuan.com/s/FbUFVf2/
https://www.wenjuan.com/s/FbUFVf2
https://www.wenjuan.com/z/FbUFVf2/
https://www.wenjuan.com/z/FbUFVf2
https://www.wenjuan.com/s/J3Eny25/
https://www.wenjuan.com/s/J3Eny25
https://www.wenjuan.com/z/J3Eny25/
https://www.wenjuan.com/z/J3Eny25
https://www.wenjuan.com/s/Rvuym2c/
https://www.wenjuan.com/s/Rvuym2c
https://www.wenjuan.com/z/Rvuym2c/
https://www.wenjuan.com/z/Rvuym2c
https://www.wenjuan.com/s/6zMVfeg/
https://www.wenjuan.com/s/6zMVfeg
https://www.wenjuan.com/z/6zMVfeg/
https://www.wenjuan.com/z/6zMVfeg
https://www.wenjuan.com/s/vIJRzm/
https://www.wenjuan.com/s/vIJRzm
https://www.wenjuan.com/z/vIJRzm/
https://www.wenjuan.com/z/vIJRzm
https://www.wenjuan.com/s/nQvEVrW/
https://www.wenjuan.com/s/nQvEVrW
https://www.wenjuan.com/z/nQvEVrW/
https://www.wenjuan.com/z/nQvEVrW
https://www.wenjuan.com/s/AZZny2F/
https://www.wenjuan.com/s/AZZny2F
https://www.wenjuan.com/z/AZZny2F/
https://www.wenjuan.com/z/AZZny2F
https://www.wenjuan.com/s/nuI3i20/
https://www.wenjuan.com/s/nuI3i20
https://www.wenjuan.com/z/nuI3i20/
https://www.wenjuan.com/z/nuI3i20
https://www.wenjuan.com/s/3Avy2mZ/
https://www.wenjuan.com/s/3Avy2mZ
https://www.wenjuan.com/z/3Avy2mZ/
https://www.wenjuan.com/z/3Avy2mZ
https://www.wenjuan.com/s/ia6R7jP/
https://www.wenjuan.com/s/ia6R7jP
https://www.wenjuan.com/z/ia6R7jP/
https://www.wenjuan.com/z/ia6R7jP
https://www.wenjuan.com/s/aqimMb/
https://www.wenjuan.com/s/aqimMb
https://www.wenjuan.com/z/aqimMb/
https://www.wenjuan.com/z/aqimMb
https://www.wenjuan.com/s/Uj2IFfW/
https://www.wenjuan.com/s/Uj2IFfW
https://www.wenjuan.com/z/Uj2IFfW/
https://www.wenjuan.com/z/Uj2IFfW
https://www.wenjuan.com/s/ZbIvMvz/
https://www.wenjuan.com/s/ZbIvMvz
https://www.wenjuan.com/z/ZbIvMvz/
https://www.wenjuan.com/z/ZbIvMvz
https://www.wenjuan.com/s/36fyA3N/
https://www.wenjuan.com/s/36fyA3N
https://www.wenjuan.com/z/36fyA3N/
https://www.wenjuan.com/z/36fyA3N
https://www.wenjuan.com/s/VZbAfeu/
https://www.wenjuan.com/s/VZbAfeu
https://www.wenjuan.com/z/VZbAfeu/
https://www.wenjuan.com/z/VZbAfeu
https://www.wenjuan.com/s/RFfAFjR/
https://www.wenjuan.com/s/RFfAFjR
https://www.wenjuan.com/z/RFfAFjR/
https://www.wenjuan.com/z/RFfAFjR
https://www.wenjuan.com/s/IFRj6jw/
https://www.wenjuan.com/s/IFRj6jw
https://www.wenjuan.com/z/IFRj6jw/
https://www.wenjuan.com/z/IFRj6jw
https://www.wenjuan.com/s/eiYFRva/
https://www.wenjuan.com/s/eiYFRva
https://www.wenjuan.com/z/eiYFRva/
https://www.wenjuan.com/z/eiYFRva
https://www.wenjuan.com/s/EfEn2aY/
https://www.wenjuan.com/s/EfEn2aY
https://www.wenjuan.com/z/EfEn2aY/
https://www.wenjuan.com/z/EfEn2aY
https://www.wenjuan.com/s/bEnu6rH/
https://www.wenjuan.com/s/bEnu6rH
https://www.wenjuan.com/z/bEnu6rH/
https://www.wenjuan.com/z/bEnu6rH
https://www.wenjuan.com/s/7NZVna4/
https://www.wenjuan.com/s/7NZVna4
https://www.wenjuan.com/z/7NZVna4/
https://www.wenjuan.com/z/7NZVna4
https://www.wenjuan.com/s/JRFvEjk/
https://www.wenjuan.com/s/JRFvEjk
https://www.wenjuan.com/z/JRFvEjk/
https://www.wenjuan.com/z/JRFvEjk
https://www.wenjuan.com/s/YfyQz2/
https://www.wenjuan.com/s/YfyQz2
https://www.wenjuan.com/z/YfyQz2/
https://www.wenjuan.com/z/YfyQz2
https://www.wenjuan.com/s/rQ7BZfv/
https://www.wenjuan.com/s/rQ7BZfv
https://www.wenjuan.com/z/rQ7BZfv/
https://www.wenjuan.com/z/rQ7BZfv
https://www.wenjuan.com/s/vQRNNb2/
https://www.wenjuan.com/s/vQRNNb2
https://www.wenjuan.com/z/vQRNNb2/
https://www.wenjuan.com/z/vQRNNb2
https://www.wenjuan.com/s/ymiQzy/
https://www.wenjuan.com/s/ymiQzy
https://www.wenjuan.com/z/ymiQzy/
https://www.wenjuan.com/z/ymiQzy
https://www.wenjuan.com/s/En6jamK/
https://www.wenjuan.com/s/En6jamK
https://www.wenjuan.com/z/En6jamK/
https://www.wenjuan.com/z/En6jamK
https://www.wenjuan.com/s/uYnQBfJ/
https://www.wenjuan.com/s/uYnQBfJ
https://www.wenjuan.com/z/uYnQBfJ/
https://www.wenjuan.com/z/uYnQBfJ
https://www.wenjuan.com/s/nUf6BrV/
https://www.wenjuan.com/s/nUf6BrV
https://www.wenjuan.com/z/nUf6BrV/
https://www.wenjuan.com/z/nUf6BrV
https://www.wenjuan.com/s/Z7FnIf/
https://www.wenjuan.com/s/Z7FnIf
https://www.wenjuan.com/z/Z7FnIf/
https://www.wenjuan.com/z/Z7FnIf
https://www.wenjuan.com/s/7Bv2aea/
https://www.wenjuan.com/s/7Bv2aea
https://www.wenjuan.com/z/7Bv2aea/
https://www.wenjuan.com/z/7Bv2aea
https://www.wenjuan.com/s/buERzmW/
https://www.wenjuan.com/s/buERzmW
https://www.wenjuan.com/z/buERzmW/
https://www.wenjuan.com/z/buERzmW
https://www.wenjuan.com/s/fY3AZbY/
https://www.wenjuan.com/s/fY3AZbY
https://www.wenjuan.com/z/fY3AZbY/
https://www.wenjuan.com/z/fY3AZbY
https://www.wenjuan.com/s/bMBbiyL/
https://www.wenjuan.com/s/bMBbiyL
https://www.wenjuan.com/z/bMBbiyL/
https://www.wenjuan.com/z/bMBbiyL
https://www.wenjuan.com/s/JriIjiH/
https://www.wenjuan.com/s/JriIjiH
https://www.wenjuan.com/z/JriIjiH/
https://www.wenjuan.com/z/JriIjiH
https://www.wenjuan.com/s/vInMvub/
https://www.wenjuan.com/s/vInMvub
https://www.wenjuan.com/z/vInMvub/
https://www.wenjuan.com/z/vInMvub
https://www.wenjuan.com/s/euIVrme/
https://www.wenjuan.com/s/euIVrme
https://www.wenjuan.com/z/euIVrme/
https://www.wenjuan.com/z/euIVrme
https://www.wenjuan.com/s/Q36fee/
https://www.wenjuan.com/s/Q36fee
https://www.wenjuan.com/z/Q36fee/
https://www.wenjuan.com/z/Q36fee
https://www.wenjuan.com/s/VV3yamI/
https://www.wenjuan.com/s/VV3yamI
https://www.wenjuan.com/z/VV3yamI/
https://www.wenjuan.com/z/VV3yamI
https://www.wenjuan.com/s/Y7RrMrl/
https://www.wenjuan.com/s/Y7RrMrl
https://www.wenjuan.com/z/Y7RrMrl/
https://www.wenjuan.com/z/Y7RrMrl
https://www.wenjuan.com/s/Uji6f2s/
https://www.wenjuan.com/s/Uji6f2s
https://www.wenjuan.com/z/Uji6f2s/
https://www.wenjuan.com/z/Uji6f2s
https://www.wenjuan.com/s/y2Y7bmc/
https://www.wenjuan.com/s/y2Y7bmc
https://www.wenjuan.com/z/y2Y7bmc/
https://www.wenjuan.com/z/y2Y7bmc
https://www.wenjuan.com/s/rmyEvqE/
https://www.wenjuan.com/s/rmyEvqE
https://www.wenjuan.com/z/rmyEvqE/
https://www.wenjuan.com/z/rmyEvqE
https://www.wenjuan.com/s/MB3qqik/
https://www.wenjuan.com/s/MB3qqik
https://www.wenjuan.com/z/MB3qqik/
https://www.wenjuan.com/z/MB3qqik
https://www.wenjuan.com/s/nmUz221/
https://www.wenjuan.com/s/nmUz221
https://www.wenjuan.com/z/nmUz221/
https://www.wenjuan.com/z/nmUz221
https://www.wenjuan.com/s/FBfQBnX/
https://www.wenjuan.com/s/FBfQBnX
https://www.wenjuan.com/z/FBfQBnX/
https://www.wenjuan.com/z/FBfQBnX
https://www.wenjuan.com/s/qiUJfyN/
https://www.wenjuan.com/s/qiUJfyN
https://www.wenjuan.com/z/qiUJfyN/
https://www.wenjuan.com/z/qiUJfyN
https://www.wenjuan.com/s/zAnyU3d/
https://www.wenjuan.com/s/zAnyU3d
https://www.wenjuan.com/z/zAnyU3d/
https://www.wenjuan.com/z/zAnyU3d
https://www.wenjuan.com/s/VBRVz2f/
https://www.wenjuan.com/s/VBRVz2f
https://www.wenjuan.com/z/VBRVz2f/
https://www.wenjuan.com/z/VBRVz2f
https://www.wenjuan.com/s/nE3UbeU/
https://www.wenjuan.com/s/nE3UbeU
https://www.wenjuan.com/z/nE3UbeU/
https://www.wenjuan.com/z/nE3UbeU
https://www.wenjuan.com/s/EZrIzed/
https://www.wenjuan.com/s/EZrIzed
https://www.wenjuan.com/z/EZrIzed/
https://www.wenjuan.com/z/EZrIzed
https://www.wenjuan.com/s/7f6n2m/
https://www.wenjuan.com/s/7f6n2m
https://www.wenjuan.com/z/7f6n2m/
https://www.wenjuan.com/z/7f6n2m
一.直接插入排序(Straight Insertion Sort)
排序的过程如下:给定无需序列:(3,6,9,7,1,8,2,4)
① 3,6,9,7,1,8,2,4 (将6插入到有序序列3中)
② 3,6,9,7,1,8,2,4 (将9插入到有序序列3,6中)
③ 3,6,9,7,1,8,2,4 (将7插入到有序序列3,6,9中)
④ 3,6,7,9,1,8,2,4 (将1插入到有序序列3,6,7,9中)
⑤ 1,3,6,7,9,8,2,4 (将8插入到有序序列1,3,6,7,9中)
⑥ 1,3,6,7,8,9,2,4 (将2插入到有序序列1,3,6,7,8,9中)
⑦ 1,2,3,6,7,8,9,4 (将4插入到有序序列1,2,3,6,7,8,9中)
⑧ 1,2,3,4,6,7,8,9 (排序成功)
using System;
namespace SortAlgorithm
{
/// <summary>
/// 直接插入算法
/// </summary>
class Program
{
public static void Main(string[] args)
{
//j指针用于查找插入位置,temp用于记录当前要插入元素
int j,temp;
//待排序数组
int[] array={3,6,5,9,7,1,8,2,4};
//第一个元素默认有序,所以i从1开始,既拿第二个元素开始插入
for(int i=1;i<array.Length;i++)
{
//将待插入元素保存在temp中
temp=array[i];
j=i-1;
while(j>=0&&temp<array[j])
{
array[j+1]=array[j];//向后移动元素
j--;
}
array[j+1]=temp;//将待插入元素插入到所查找好的位置
}
//打印已排好的元素
foreach(int i in array)
{
Console.Write(i+" ");
}
Console.ReadKey(true);
}
}
}
以上代码中的while(j>=0&&temp<array[j])需要进行两次比较,这里可以做一些改进,可以通过设置监视哨减少循环中的比较次数。所谓监视哨就是利用数组的某个元素来存放当前待排序的元素,从而达到避免数组越界和减少比较次数的目的,这里使用array[0]来作为监视哨,改进后的代码如下:
using System;
namespace InsertionSort
{
class Program
{
public static void Main(string[] args)
{
//待排序数组
int[] array={0,3,6,5,9,7,1,8,2,4};
//j指针用于查找插入位置
int j;
for(int i=1;i<array.Length;i++)
{
array[0]=array[i];
j=i-1;
while(array[0]<array[j])
{
array[j+1]=array[j];
j--;
}
array[j+1]=array[0];
}
foreach(int i in array)
{
Console.Write(i+" ");
}
Console.ReadKey(true);
}
}
}
注意
:使用监视哨的前提是array[0]元素不能存在于排序序列中,只作为辅助变量
直接插入排序算法最好情况的时间复杂度:O(n),最坏情况为:o(n²)
二.希尔排序
希尔排序(Shell Sort)又称缩小增量排序,它是对直接插入排序的一种改进方法,直接插入排序适合于数据量较少的排序,
当待排序记录序列接近正序时,其时间复杂度为O(n),希尔排序正是依此对直接排序进行的改进算法,其基本思想是将待
排序的元素分组,从而减少参与直接插入排序的数据量,当经过几次分组后,元素的排列已经基本有序,这时再对所有元素
实施直接插入排序,算法如下:
using System;
namespace ShellSort
{
/// <summary>
/// 希尔排序
/// </summary>
class Program
{
public static void Main(string[] args)
{
//待排序数组
int[] array={3,6,5,9,7,1,8,2,4};
int j,temp;
//d为步长
for(int d=array.Length/2;d>=1;d=d/2)
{
for(int i=d;i<array.Length;i++)
{
temp=array[i];
j=i-d;
while(j>=0&&temp<array[j])
{
array[j+1]=array[j];
j=j-d;
}
array[j+d]=temp;
}
}
foreach(int i in array)
{
Console.Write(i+" ");
}
Console.ReadKey(true);
}
}
}
浙公网安备 33010602011771号