折半插入排序

相比起直接插入排序,折半插入排序減少了關鍵字的比較次數,而記錄的移動次數不變,因此折半插入排序的時間複雜度仍然爲O(n^2)

穩定性:穩定

void BInsertSort(int a[], int size) 
{
	int i, j, low = 0, high = 0, mid;
	int temp = 0;
	for (i = 1; i < size; i++) 
	{
		low = 0;
		high = i - 1;
		temp = a[i];
		//採用折半查找法判斷插入位置,最終變量 low 表示插入位置
		while (low <= high) 
		{
			mid = (low + high) / 2;
			if (a[mid] > temp) 
			{
				high = mid - 1;
			}
			else {
				low = mid + 1;
			}
		}
		//有序表中插入位置後的元素統一後移
		for (j = i; j > low; j--) {
			a[j] = a[j - 1];
		}
		a[low] = temp;//插入元素
	}
}

完整代碼

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

void PrintArray(int *Array, int iSize)
{
	for (int i = 0; i < iSize; i++)
	{
		cout << "Key is " <<i<<" Current Value is " << Array[i] << endl;
	}
}
void BInsertSort(int a[], int size) 
{
	int i, j, low = 0, high = 0, mid;
	int temp = 0;
	for (i = 1; i < size; i++) 
	{
		low = 0;
		high = i - 1;
		temp = a[i];
		//採用折半查找法判斷插入位置,最終變量 low 表示插入位置
		while (low <= high) 
		{
			mid = (low + high) / 2;
			if (a[mid] > temp) 
			{
				high = mid - 1;
			}
			else {
				low = mid + 1;
			}
		}
		//有序表中插入位置後的元素統一後移
		for (j = i; j > low; j--) {
			a[j] = a[j - 1];
		}
		a[low] = temp;//插入元素
	}
}
int main()
{
	int a[10] = { 9,10,8,7,6,5,4,3,2,1 };
	BInsertSort(a,10);

	PrintArray(a,10);
	system("pause");
	return 0;
}

 

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