1. 程式人生 > >排序演算法之插入排序

排序演算法之插入排序

插入排序

直接插入排序(Straight Insertion Sort)的基本思想是:把n個待排序的元素看成為一個有序表和一個無序表。開始時有序表中只包含1個元素,無序表中包含有n-1個元素,排序過程中每次從無序表中取出第一個元素,將它插入到有序表中的適當位置,使之成為新的有序表,重複n-1次可完成排序過程。

圖解例項:


程式碼實現:

//如果不使用len = getarraylength(arr); 執行結果失敗,應該會輸出整個陣列,但是隻輸出了第一個值

#include <iostream>

using namespace std;

int arr[10] = {5, 62, 8, 34, 92, 15, 45, 42, 78, 68};

//這裡使用模板的意義在於增加程式碼的泛化性,真實刷題可以不用模板,求陣列長度直接int len = sizeof(arr)/sizeof(arr[0]);
template<class T>
int getarraylength(T& arr)
{
    return (sizeof(arr)/sizeof(arr[0]));
}

int len = getarraylength(arr);

//將陣列打印出來
void print(int arr[])
{
    for(int i = 0; i < len; i++)
    {
        cout << arr[i] << endl;
    }
}

void insertsort(int arr[])
{
    //這裡如果直接使用getarraylength(arr)時會出錯,用len來代替就不會出錯,目前還沒能解決這個問題
    for(int i = 1; i < len; i++)
    {
        int temp = arr[i];
        //找到一個數temp, 新增到他前面的已經排序好的陣列中相應位置
        for(int j = i-1; j >= 0; j--)
        {
            if(arr[j] < temp && arr[j+1] > temp)
            {
                //陣列一部分移動
                for(int k = i; k > j+1; k--)
                {
                    arr[k] = arr[k-1];
                }
                //將temp插入到他應有的地方
                arr[j+1] = temp;
            }
        }
    }
    //print(arr);
}

int main()
{
    insertsort(arr);
    cout << getarraylength(arr) << endl;
    cout << len << endl;
    print(arr);
    return 0;
}

執行結果: