少年未央

导航

排序--插入排序

  上学的时候学数据结构,没有意识到它的重要性,而如今工作了,也积累了一些项目经验,回过头来再看数据结构,才感觉出那看似“基础”的知识,其中蕴含着最简单,也最深刻的道理,所以打算重新系统得复习一下,在此写的文章就算是自己的复习笔记了。

  今天先从排序开始复习,我所了解的排序有内排序和外排序之分,假如整个排序过程不需要访问外存的话便能实现排序,则此类排序称为内排序,反之,若参加排序的记录数非常大,内存是无法容纳这些记录的,就得需要外部存储设备来进行排序,则称此类排序为外部排序。

  学习数据结构最重要的是掌握它的一些思想精华,排序算法就很有代表性,排序算法大致可分为:插入排序,选择排序,交换排序,归并排序等。今天首先来复习插入排序,插入排序的主要思想是不断地将待排序的元素插入到有序序列中,使有序序列不断扩大,直至所有元素都被插入有序序列中。插入排序算法比较典型的有直接插入排序和希尔排序。

 

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);
		}
	}
}

posted on 2010-01-04 22:34  少年未央  阅读(808)  评论(1)    收藏  举报