1. 程式人生 > >排序算法:折半插入排序

排序算法:折半插入排序

() [] names urn stream 特點 直接 依賴 cpp

算法分析:

(1)時間復雜度

  從時間上比較,折半查找比順序查找快,所以就平均性能來說,折半插入排序優於直接插入排序。

  折半插入排序所需要的關鍵字比較次數與待排序序列的初始排列無關,僅依賴於記錄的個數。不論初始序列情況如何,在插入第i個記錄時,需要經過logi+1(向下取整+1)次比較,才能確定它插入的位置。所以當記錄的初始排列為正序或接近正序時,直接插入排序比折半插入排序執行的關鍵字比較次數要少。

  折半插入排序的對象移動次數與直接插入排序相同,依賴於對象的初始排列。

  在平均情況下,折半插入排序僅減少了關鍵字的比較次數,而記錄的移動次數不變。因此,折半插入排序的時間復雜度仍然為O(n^2)。

(2)空間復雜度

  折半插入排序所需附加存儲空間和直接插入排序相同,只需要一個記錄的輔助空間r[0],所以空間復雜度為O(1)

算法特點:

(1)是穩定排序。

(2)因為要進行折半插入查找,所以只能用於順序結構,不能用於鏈式結構。

(3)適合初始記錄無序、n較大的情況。

#include<iostream>
#include<vector>
using namespace std;
void BSort(int a[],int n)
{
	for (int i = 1; i < n; i++)//數組中的第一個元素最為已經排好的序列,所以從數組的第二個元素開始排
	{
		int key = a[i];//帶插入元素
		int low = 0, high = i - 1;
		while (low <= high)
		{
			int mid = (low + high) / 2;
			if (key < a[mid])
			{
				high = mid - 1;
			}
			else
			{
				low = mid + 1;
			}
		}
		for (int j = i - 1; j >= high + 1; j--)
		{//i-1是已經排好序的序列的數量,high+1是待插入的的位置,元素後移騰出high+1這個位置
			a[j + 1] = a[j];
		}
		a[high + 1] = key;
	}
}
int main()
{
	int a [11] = { 2,6,4,5,54,53,53,5,34,34,32};
	BSort(a, 11);
	for (int i = 0; i < 11; i++)
	{
		cout << a[i] << " ";
	}
	return 0;
}

  

排序算法:折半插入排序