天天看點

七大排序算法---直接插入排序及折半優化

思路分析

将一個待排序元素,按其大小,插入到前面已經排好序的一組元素的合适位置上去,直到元素全部插完為止。

七大排序算法---直接插入排序及折半優化

簡單來說:end指已經排好數組的最後一個元素,end找到插入的位置(設定一個temp,temp為已經排序好數組的下一個元素),用temp與end比較,如果temp

代碼實作

void InsertSort(int array[], int size)
{
    int end = ;//已經排好的最後一個數
    int temp = ;//需要排序的數
    for (int i = ; i < size - ; i++)
    {
        end = i;
        temp = array[end + ];//将要排序的數标記
        while (end >=  && array[end]>temp)
        {
            array[end + ] = array[end];
            end--;
        }
        array[end + ] = temp;
    }
}

int main()
{
    int n = ;
    int array[] = { , , , , , , , , ,  };

    InsertSort(array, );
    for (; n < ; n++)
    {
        printf("%d", array[n]);
    }


    return ;
}
           

優化:二分查找直接排序

當數組長度過大的時候,找到要插入的位置會消耗大量資源,使用二分查找可以更快的找到插入位置。

/直接插入排序二分法
void InsertSort(int array[], int size)
{
    int end;//已經排好的最後一個數
    int temp;//需要排序的數
    int left;//二分法左邊界
    int right;//二分法右邊界

    for (int i = ; i < size - ; i++)
    {
        end = i;
        temp = array[i + ];
        left = ;
        right = end;
        while (left <= right)
        {
            int mid = left + ((right - left)>>);//防止越界
            if (array[mid]>temp)
            {
                right = mid - ;
            }
            else
            {
                left = mid + ;//等于mid的情況同樣插到後面
            }
        }
        while (end >=  && end >= left)
        {
            array[end + ] = array[end];
            end--;
        }
        array[end + ] = temp;
    }
}


int main()
{
    int n = ;
    int array[] = { , , , , , , , , ,  };

    InsertSort(array, );
    for (; n < ; n++)
    {
        printf("%d", array[n]);
    }


    return ;
}
           

繼續閱讀