天天看點

排序問題:各種排序算法的時間複雜度 比較

排序問題:各種排序算法的時間複雜度 比較

1.冒泡排序:n*n。  倆個for循環決定其時間複雜度為n^2

template <class T> void Swap(T A[], int i, int j)

{

    T tmp = A[i];

    A[i] = A[j];

    A[j] = tmp;

}

//冒泡法bubble sort

template<class T> void BubSort(T A[], int n)

{

    for (int i=0; i<n; ++i)

    {

        for (int j=i+1; j<n; ++j)

        {

            if (A[i] < A[j])

                Swap(A, i, j);

        }

    }

}

2.選擇排序:n*n。  同樣,倆個for循環決定其時間複雜度為n^2。

  template <class T> void Swap(T A[], int i, int j)

{

    T tmp = A[i];

    A[i] = A[j];

    A[j] = tmp;

}

template<class T> void SelSort(T A[], int n)

{

    for (int i=0; i<n; ++i)

    {

        int largIndex = i;    //largIndex存儲元素值大的下标

        for (int j=i+1; j<n; ++j)

        {

            if (A[largIndex] < A[j])

                largIndex = j;    //發現了較大的元素,記錄下它的下标

        }

        Swap<T>(A, i, largIndex);    //隻進行最後一次交換

    }

}

3.直接插入排序:n*n。  倆個for循環。

// 1->插入排序

void InsertSort(int array[], int length)

{

    int i, j, key;

    for (i = 1; i < length; i++)

    {

        key = array[i];

        // 把i之前所有大于array[i]的資料向後移動

        for (j = i - 1; j >= 0 && array[j] > key; j--)

        {

            array[j + 1] = array[j];

        }

        // 在合适位置安放目前元素

        array[j + 1] = key;

    }

}

// 2-->插入法insert sort 

 template <class T> void Swap(T A[], int i, int j)

{

    T tmp = A[i];

    A[i] = A[j];

    A[j] = tmp;

}

//插入法insert sort 

template<class T> void InsSort(T A[], int n)

{

    for (int i=1; i<n; ++i)    //i為什麼要初始化為1?因為在i的前面至少有一個元素,才能比較。

    {

        for (int j=i; (j>0) && (A[j]>A[j-1]); --j)//總是與它的前一個元素比較,j>0是為了保證j-1不會溢出

        {

            Swap<T>(A, j, j-1);    

        }

    }

}             4.快速排序:

排序問題:各種排序算法的時間複雜度 比較

繼續閱讀