c++排序算法之插入法

1.後插(從後往前插入)

思路:數組有N個元素,第i次循環後,前面i+1個元素排成升序,,現在要將第i+2個元素插入,具體做法:找到能插入的位置,在從後往前挨個找的過程中,把每一個比要插入的元素大的元素往後移一位,最後把值插入。

void back_insert(int a[], int n)
{
	for (int i = 1; i < n; i++)
	{
		int p = a[i];
		int j = i - 1;
		while (p < a[j] && j >= 0)
		{
			a[j + 1] = a[j];//比a[i]大的a[j]後移
			j--;
		}
		a[j + 1] = p;//插入
	}
		
}

2.前插(從前往後插入)

思路:數組有N個元素,第i次循環後,前面i+1個元素排成升序,,現在要將第i+2個元素插入,具體做法:先找到要插入的位置,然後把該位置後面的元素從後往前依次後移一位,最後插入。

void front_insert(int a[], int n)
{
	for (int i = 1; i < n; i++)
	{
		int p = a[i];
		int j = 0;
		while (p>a[j] && j < i)
		{
			j++;
		}
		for (int k = i; k > j; k--)
		{
			a[k] = a[k - 1];
		}
		a[j] = p;

	}
}

後插性能分析:
最好情況:原序列已經排好序,每趟操作只需一次比較,兩次移動,所以總比較次數爲n-1,總移動次數爲2(n-1);

最壞情況:第j趟操作,需要和之前的j個元素比較,並做出j+2次移動,所以總比較次數爲n(n-1)/2,總移動次數爲n(n-1)/2p

+2n;
平均狀況:第j趟操作,需要和之前的j/2個元素比較,並做出j/2+2次移動,總比較次數n(n-1)/4,總移動次數爲
n(n-1)/4+2n;

所以,插入排序時間複雜度爲O(n2),是個穩定的排序方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章