c++實現直接插入排序


基本概念

直接插入排序是一種最簡單的排序方法,排序過程為:先將第一個元素看作是只有一個元素的有序子表,然后從第二個元素開始,將待排序元素依次插入到前面有序的子表中,直到全部排序完畢。在整個過程中,前面的元素是已經排序號的列表,后面的元素為待排序處理。

 

基本過程

將第一個元素看作是一個有序的列表,從第二個元素開始將元素與有序部分中的元素比較找到合適的插入位置,將插入位置后的元素依次后移一個位置。在最好的情況下表中的元素已經是有序表只需要比較不需要移動,這是的時間復雜度是O(n)。最壞的情況下,表中的元素是逆序的比較次數達到最大為:∑ni=2 i,總的移動次數也達到最大為∑ni=2  (i+1)。平均的情況下帶排序的元素是隨機的,此時可以去上訴情況的平均值作為平均情況下的時間復雜度總的比較和移動的平均次數約為n2/4。所以直接插入排序的時間復雜度為O(n2)。

排序過程中需要一個輔助空間,所以時間復雜度為O(1)。


 

如下排序是將列表{ 7,3,5,4,6 }升序的排序過程。

                                                                                          

 

以下是C++代碼實現:

#include <iostream>

using namespace std;


//創建數組
void CreateArry(int arry[], int len)
{
    cout << "輸入數組的元素。。。" << endl;
    int key;
    for (int i = 0; i < len; i++)
    {
        cin >> key;
        arry[i] = key;
    }
}

//直接插入排序
void Inert_Sort(int arry[], int len)
{
    int i, j;
    for (i = 1; i < len; ++i)
    {
        int temp = arry[i];
        for (j = i - 1; j >= 0; --j)
        {
            if (temp < arry[j])
            {
                arry[j + 1] = arry[j];    //在有序列表中比temp值大的元素后羿            
            }
            else { break; }//temp大於有序表中的最后一位則不需要移動
        }
        arry[j+1] = temp;//跳出內層循環后插入在合適的位置
    }
}

//打印數組
void Print(int arry[], int len)
{
    for (int i = 0; i < len; i++)
    {
        cout << arry[i] << " ";
    }
    cout << endl;
}

void test01()
{
    int arry[5];
    int len = sizeof(arry) / sizeof(arry[0]);
    CreateArry(arry, len);
    Inert_Sort(arry, len);
    Print(arry, len);
}

int main()
{
    test01();

    system("pause");
    return 0;
}

運行結果:

輸入待排序序列 7,3,5,4,6 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM