1. 程式人生 > >【演算法導論】插入排序法

【演算法導論】插入排序法

插入排序法的時間複雜度為n的平方,對於較小的輸入規模來說,插入排序法比合並排序法更快些。在最佳情況下,即輸入陣列已經排序好,則時間複雜度可表示為n,是一個線性函式;在最差情況下,即輸入陣列是逆序排列時,時間複雜度為.插入排序法的具體實現方法如下:


具體的c/c++語言實現如下:

#include<iostream>
#include<ctime> 
using namespace std;

void InsectionSortAscend(int* arrayA,int Length);//插入排序法:升序
void InsectionSortDescend(int* arrayA,int Length);//插入排序法:降序

void main()
{
	clock_t start,finish;
    double totaltime;
    start=clock();

	int arrayA[6]={5,2,4,6,1,3};
	int Length=sizeof(arrayA)/sizeof(int);

	InsectionSortDescend(arrayA,Length);
	InsectionSortAscend(arrayA,Length);
    
	finish=clock();
    totaltime=(double)(finish-start)/CLOCKS_PER_SEC;
    cout<<"此兩個程式的執行時間為"<<totaltime<<"秒!"<<endl;
    
}
/*****************************************
/            插入排序
/輸入:陣列arrayA、陣列長度
/輸出:由小到大已排列好的陣列
/時間複雜度:n的平方
/*****************************************/
void InsectionSortAscend(int* arrayA,int Length)
{
	int i=0;
	int j=0;
	int temp=0;
    
	for(i=1;i<Length;i++)
	{
		temp=arrayA[i];
		j=i-1;
		while(j>=0&&arrayA[j]>temp)
		{
			arrayA[j+1]=arrayA[j];
			j=j-1;
		}
		arrayA[j+1]=temp;
	}
    for(int i=0;i<Length;i++)
	   cout<<arrayA[i];
	cout<<endl;

}

/*****************************************
/            插入排序
/輸入:陣列arrayA、陣列長度
/輸出:由大到小已排列好的陣列
/時間複雜度:n的平方
/*****************************************/
void InsectionSortDescend(int* arrayA,int Length)
{
	int i=0;
	int j=0;
	int temp=0;
    
	for(i=Length-2;i>=0;i--)
	{
		temp=arrayA[i];
		j=i+1;
		while(j<Length&&arrayA[j]>temp)
		{
			arrayA[j-1]=arrayA[j];
			j=j+1;
		}
		arrayA[j-1]=temp;
		
	}
    for(int i=0;i<Length;i++)
	   cout<<arrayA[i];
	cout<<endl;

}

注意:我是在vs2008上執行的,與vc 6.0有點區別,主要是迴圈體中的迴圈變數的作用域,出錯體現在迴圈變數的重複定義上。例如:在vs2008或vs2010上,程式為:

#include<stdio.h>
void main()
{
int i=0;
for(int i=0;i<5;i++)
printf("%d ",i);
}

則在VC 6.0上需改為:

#include<stdio.h>
void main()
{
int i=0;
for(i=0;i<5;i++)
printf("%d ",i);
} 


排序法除了上述所說的之外還有大家都經常用的氣泡排序法,其時間複雜度為n的平方。在這裡我就不具體介紹了。

下面簡單介紹一下如何高效的計算多項式: