有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法---插入排序。插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序。
基本思想:
每一步将要插入的数与前面有序序列中的元素依次相比较,找到合适的位置后,数列部分后移腾出空间,待插入的元素插入数列,直到全部插完为止。(这里想一想我们打麻将或者斗地主的时候是怎么码牌的,懂了吧^_^!)
还是写个例子吧,要求对63,4,24,1,3,15使用插入排序法从小到大排列。
C++实例:
#include<iostream>
using namespace std;
//输出
void ShowArray(int *array,int Length)
{
for(int i=0;i<Length;i++)
{
cout<<array[i]<<" ";
}
cout<<endl;
}
//插入排序
void InsertSort(int *array,int Length)
{
int i,j,key;
for(i=1;i<Length;i++) //确定待插入元素
{
key = array[i]; //key为待插入元素
for(j=i;j>0&&array[j-1]>key;j--) //查找要插入的位置,循环结束,则找到插入位置
{
array[j]=array[j-1]; //向后移位,腾出插入的空间
}
array[j]=key; //插入元素
}
ShowArray(array,Length);
}
void main()
{
int array[]={63,4,24,1,3,15};
int Length=sizeof(array)/sizeof(array[0]);
InsertSort(array,Length);
}
C#实例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Sort
{
class Sort //定义Sort类
{//定义插入排序方法
public void InsertSort(int[] array)
{
int i,j,key;
for(i=1;i<array.Length;i++) //控制要插入的元素
{
key=array[i];
for(j=i;j>0&&array[j-1]>key;j--) //确定要插入的位置
{
array[j] = array[j - 1];
}
array[j] = key; //插入元素
}
ShowArray(array);
}
public void ShowArray(int[] array)
{
foreach (int i in array)
{
Console.Write(i+" ");
}
Console.WriteLine();
}
static void Main(string[] args)
{
int[] array = new int[] {63,4,24,1,3,15};
Sort sorter = new Sort();
sorter.InsertSort(array);
}
}
}
结果:
java实例:
package Sort;
public class InsertSort {
public void insertsort(int[] array)
{
int i,j,key;
for(i=1;i<array.length;i++)
{
key=array[i];
for(j=i;j>0&&array[j-1]>key;j--)
{
array[j]=array[j-1];
}
array[j]=key;
}
showArray(array);
}
public void showArray(int[] array)
{
for(int i : array)
{
System.out.print(i+" ");
}
System.out.println();
}
public static void main(String[] args) {
int[] array = new int[]{63,4,24,1,3,15};
InsertSort sorter = new InsertSort();
sorter.insertsort(array);
}
}
结果:
我们将直接插入排序与冒泡、选择排序相比较,感觉没多大变化,而且都有2个for循环也就是说时间复杂度是相差不多的都是n*n,但是如果排列的是一组已经排好序的数组,这就大不一样了,插入排序的时间复杂度就变成0了,要比冒泡快的很多。关于插入排序还有很多改进的算法,我们后面再说了。
有什么错误的地方,或不妥 的地方,欢迎留言^_^,您的建议是完善自我的动力!!