- //查找數值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; //插入
- }
- }
- }
需要插入的數組已經是有序的,那麼可以採用二分查找方法來尋找插入位置,提高算法效率,但算法的時間複雜度仍爲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; //插入
}
}
}