直接插入排序法
直接插入排序属于稳定的排序,时间复杂性为O(n2),空间复杂度为O(1)。
基本思路(升序思路)
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
直接插入排序法是由两层嵌套循环组成的。
外层循环标识并决定待比较的数值;内层循环为待比较的数值确定最终位置。
直接选择排序法是将待比较数与前一位数值进行比较,所以外层循环是从第二个数开始。
当待比较数值大小前一位数值则继续进行外层循环;否则进入内层循环。
在内层循环中找到比待比较数值小的并将待比较数值置入其后一位置。
在内层循环中值得我们注意的是,我们必须用一个存储空间来存放待比较数值,因为当一趟比较完成时,我们要将待比较数值置入比待比较数值小的后一位置。
物理结构
15,35,20,18,40
大括号内的数值为有序表
第一次外层循环
{15,35},20,18,40
第二次外层循环
第一次内层循环
15,35,35,18,40
{15,20,35},18,40
第三次外层循环
第一次内层循环
15,20,35,35,40
第二次内层循环
15,20,20,35,40
{15,18,20,35},40
第四次外层循环
{15,18,20,35,40}
源码(C#)
namespace
Sort
{
class Program
{
static void Main( string [] args)
{
int [] A = { 15 , 35 , 20 , 18 , 40 };
A = InsertSort(A);
foreach ( int n in A)
{
Console.Write( " {0,4} " , n);
}
}
/// <summary>
/// 直接插入排序法
/// </summary>
/// <param name="A"></param>
/// <returns></returns>
public static int [] InsertSort( int [] A)
{
for ( int i = 1 ; i < A.Length; i ++ )
{
if (A[i] < A[i - 1 ])
{
int j = i - 1 ;
int temp = A[i];
do
{
A[j + 1 ] = A[j];
} while ( -- j >= 0 && temp < A[j]);
A[j + 1 ] = temp;
}
}
return A;
}
}
}
{
class Program
{
static void Main( string [] args)
{
int [] A = { 15 , 35 , 20 , 18 , 40 };
A = InsertSort(A);
foreach ( int n in A)
{
Console.Write( " {0,4} " , n);
}
}
/// <summary>
/// 直接插入排序法
/// </summary>
/// <param name="A"></param>
/// <returns></returns>
public static int [] InsertSort( int [] A)
{
for ( int i = 1 ; i < A.Length; i ++ )
{
if (A[i] < A[i - 1 ])
{
int j = i - 1 ;
int temp = A[i];
do
{
A[j + 1 ] = A[j];
} while ( -- j >= 0 && temp < A[j]);
A[j + 1 ] = temp;
}
}
return A;
}
}
}