1. 程式人生 > >排序演算法(一):直接插入排序

排序演算法(一):直接插入排序

1.插入排序—直接插入排序(Straight Insertion Sort)

基本思想:

將一個記錄插入到已排序好的有序表中,從而得到一個新,記錄數增1的有序表。即:先將序列的第1個記錄看成是一個有序的子序列,然後從第2個記錄逐個進行插入,直至整個序列有序為止。

要點:設立哨兵,作為臨時儲存和判斷陣列邊界之用。

直接插入排序示例:

如果碰見一個和插入元素相等的,那麼插入元素把想插入的元素放在相等元素的後面。所以,相等元素的前後順序沒有改變,從原無序序列出去的順序就是排好序後的順序,所以插入排序是穩定的。

#include <stdio.h>
#include <iostream>
using namespace std;

void print(int a[], int n ,int i)
{  
    cout<<i <<":";  
    for(int j= 0; j<8; j++)
    {  
        cout<<a[j] <<" ";  
    }  
    cout<<endl;  
}  
  
  
void InsertSort(int a[], int n)  
{
	int i, j, x;
	for(i= 1; i<n; i++)
	{  
		if(a[i] < a[i-1]){       //若第i個元素大於i-1元素,直接插入。小於的話,移動有序表後插入  
			j= i-1;   
			x = a[i];                    //複製為哨兵,即儲存待排序元素  
			a[i] = a[i-1];               //先後移一個元素  
			while((j >= 0) && (x < a[j]))
			{                            //查詢在有序表的插入位置  
				a[j+1] = a[j];  
				j--;                     //元素後移  
	 		}
			a[j+1] = x;                  //插入到正確位置  
		}  
		print(a,n,i);                    //列印每趟排序的結果  
	}
}  
  
int main()
{  
    int a[8] = {3,1,5,7,2,4,9,6};  
    InsertSort(a,8); 
    return 0;
}

優點:

缺點:

優化: