1. 程式人生 > >排序演算法分析

排序演算法分析

據說在計算機發明後的很長一段時間內,30%以上的算力都是用來做排序這一件事情。

很久以來,自己由於習慣於依賴各種現成的庫,對於各種排序演算法生疏久已,甚至對於選擇、冒泡、插入等排序的區別都有些模糊不清了。我們慶幸於生在這個年代,安心享受著前輩大師們的智慧結晶,可以說是站在巨人的肩膀上眺望遠方了。此篇部落格用來總結各種排序演算法,強化對演算法重要性的認識,並且向各位對排序演算法做出改進的大師們致敬了。

一、選擇排序

·演算法描述

首先,找到陣列中最小的那個元素,使它和陣列中的第一個元素交換位置;再次,在剩下的元素中繼續找最小的那個,使他和陣列中的第二個元素交換位置。如此往復,直到整個陣列排序。

·演算法特點

1、執行時間和輸入無關

一個有序的陣列和一個元素隨機排列的陣列,排序的時間複雜度竟然一樣。

2、資料移動是最少的

資料交換隻在最內層迴圈之外的地方發生。交換的次數和陣列的大小是成線性關係的,我們研究的其他演算法都不具備這個特徵

·時間複雜度分析

對於長度為N的陣列,選擇排序需要N2/2次比較和N次交換。總的來說時間複雜度為平方級別O(N2)

·空間複雜度分析

基本不佔用多餘的記憶體空間,複雜度為O(1)。

·適用情景

任何剛學程式設計的菜鳥的第一思路基本就是這個了:)

·示例程式碼

    //選擇排序
void selectSort(int
*a,int size) { for(int i = 0; i < size; ++i) { //最小值索引 int minIndex = i; for(int j = i+1; j < size; ++j) { //查詢最小值的索引 if(*(a+j) < *(a+minIndex)) { minIndex = j; } } //交換陣列中兩個位置的值
if(minIndex != i) { int tmp = *(a+i); *(a+i) = *(a+minIndex); *(a+minIndex) = tmp; } } }

二、氣泡排序

三、插入排序

·演算法描述

我們平時打撲克摸牌時,每摸到一張牌,就要插入到手中已排好序的所有牌中,插入排序的演算法跟這個很相似。陣列左側都是已拍好序的元素,讀取右側的每一個元素,都要插入到左側的有序元素中去,左側的有序元素,會根據新插入元素的位置,做部分整體的向右移位,當所有元素都已插入完畢時,排序結束。

·演算法特點

·時間複雜度

·空間複雜度

·適用情景

·示例程式碼

//插入排序
void insertsort(int *a,int size)
{
    for(int i = 1; i < size; ++i)
    {
        for(int j = i; j > 0; j--)
        {
            if(*(a+j) < *(a+j-1))
            {
                int tmp = *(a+j);
                *(a+j) = *(a+j-1);
                *(a+j-1) = tmp;
            }
            else
            {
                break;
            }

        }
    }
}

四、歸併排序

五、快速排序

六、希爾排序