1. 程式人生 > >資訊學奧賽系列教程:插入排序

資訊學奧賽系列教程:插入排序

插入排序:

      有一個已經有序的資料序列,要求在這個已經排好的資料序列中插入一個數,但要求插入後此資料序列仍然有序。插入排序類似於打撲克時摸排的情形,每次將摸到的牌按花色和大小插入適當的位置,如下圖所示:

插入排序基本思想:

 每步將一個待排序的記錄,按其關鍵碼值的大小插入前面已經排序的檔案中適當位置上,直到全部插入完為止。排序過程如下圖所示

插入排序的程式碼實現:

#include <iostream>
using namespace std;
const int N=10;
int a[N];

void addsort(int val,int index) //插入並排序
{
   if (index ==1) //第一個元素直接插入
   {
	  a[0] =val;
	  return;
   }
   if (index ==2) //第二個元素和前一個比較
   {
	  if (a[0]>val)
	  {
	  	a[1] = a[0];
	  	a[0] = val;
	  	
	  }
	  else
	  {
		a[1] =val;
	  }
	  return;
   }
   for (int i=0;i<index;i++)
   {
	   if (a[i]>val)
	   {
		  for (int j=index-1;j>=i;j--) //將後面的元素都往後移一位
		  {
			 a[j] =a[j-1];
		  }
		  a[i] = val;
		  break;
	   }
	   a[index-1] =val;
   }
}
int main()
{
	int m,n;
	cout<<"請輸入排序個數:"<<endl;
	cin>>m;
	for (int i=1;i<=m;i++)
	{
		cout<<"請輸入第"<<i<<"個數:"<<endl;
		cin>>n;
		addsort(n,i); //邊插入邊排序
	}
	for (int i=0;i<m;i++)
	{
		cout<<a[i]<<endl;
	}
	return 0;
}

插入排序的時間複雜度:

     插入排序時需要比較待插入元素的大小,選擇合適的位置,並且將後面的元素進行移動,時間複雜度為O(n2).

插入排序的穩定性:

   插入排序是一種穩定的排序