二分排序法(折半插入法)

  1. //查找數值iData在長度爲iLen的pDataArray數組中的插入位置  
  2. int FindInsertIndex(int *pDataArray, int iLen, int iData)  
  3. {  
  4.     int iBegin = 0;  
  5.     int iEnd = iLen - 1;  
  6.     int index = -1;    //記錄插入位置  
  7.     while (iBegin <= iEnd)  
  8.     {  
  9.         index = (iBegin + iEnd) / 2;  
  10.         if (pDataArray[index] > iData)  
  11.             iEnd = index - 1;  
  12.         else  
  13.             iBegin = index + 1;   
  14.     }  
  15.     if (pDataArray[index] <= iData)  
  16.         index++;  
  17.     return index;  
  18. }  
  19.   
  20. /******************************************************** 
  21. *函數名稱:BinaryInsertSort 
  22. *參數說明:pDataArray 無序數組; 
  23. *          iDataNum爲無序數據個數 
  24. *說明:    二分查找插入排序 
  25. *********************************************************/  
  26. void BinaryInsertSort(int* pDataArray, int iDataNum)  
  27. {  
  28.     for (int i = 1; i < iDataNum; i++)    //從第2個數據開始插入  
  29.     {  
  30.         int index = FindInsertIndex(pDataArray, i, pDataArray[i]);    //二分尋找插入的位置  
  31.           
  32.         if (i != index)    //插入位置不爲i,才挪動、插入  
  33.         {  
  34.             int j = i;  
  35.             int temp = pDataArray[i];  
  36.             while (j > index)    //挪動位置  
  37.             {  
  38.                 pDataArray[j] = pDataArray[j-1];  
  39.                 j--;  
  40.             }  
  41.             pDataArray[j] = temp;    //插入  
  42.         }  
  43.     }  
  44. }  

需要插入的數組已經是有序的,那麼可以採用二分查找方法來尋找插入位置,提高算法效率,但算法的時間複雜度仍爲O(n2)。

//查找數值iData在長度爲iLen的pDataArray數組中的插入位置
int FindInsertIndex(int *pDataArray, int iLen, int iData)
{
	int iBegin = 0;
	int iEnd = iLen - 1;
	int index = -1;    //記錄插入位置
	while (iBegin <= iEnd)
	{
		index = (iBegin + iEnd) / 2;
		if (pDataArray[index] > iData)
			iEnd = index - 1;
		else
			iBegin = index + 1; 
	}
	if (pDataArray[index] <= iData)
		index++;
	return index;
}

/********************************************************
*函數名稱:BinaryInsertSort
*參數說明:pDataArray 無序數組;
*		   iDataNum爲無序數據個數
*說明:    二分查找插入排序
*********************************************************/
void BinaryInsertSort(int* pDataArray, int iDataNum)
{
	for (int i = 1; i < iDataNum; i++)    //從第2個數據開始插入
	{
		int index = FindInsertIndex(pDataArray, i, pDataArray[i]);    //二分尋找插入的位置
		
		if (i != index)    //插入位置不爲i,才挪動、插入
		{
			int j = i;
			int temp = pDataArray[i];
			while (j > index)    //挪動位置
			{
				pDataArray[j] = pDataArray[j-1];
				j--;
			}
			pDataArray[j] = temp;    //插入
		}
	}
}


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