排序演算法 n 2級別

2021-08-09 23:33:02 字數 1792 閱讀 9263

n^2級別的演算法,是排序演算法中,效率最低的,也稱暴力法。

主要有:選擇排序,插入排序,氣泡排序。(效率較高的希爾排序)

1.選擇排序(selection sort)

原演算法思想是:從左到右遍歷出最大的,放到右端。然後繼續,每次拿出最大的,放在右端。

template void selectionsort(t * arr, int n)

}

2.插入排序(insertion sort)

原演算法思想是:從左到右,依次遍歷,把當前位置的資料,在左邊部分找到合適的位置放入。這樣,到最後,左邊的資料將是有序的。

>對比選擇排序:優點,利用了左邊部分的有序,能提前的結束內層迴圈。從而該演算法會優於選擇排序法。

>適合場景:在對近乎有序的資料進行排序時,效能可以達到o(n)級別。

template void insertionsort(t * arr, int n)
此版本的**,內層使用的冒泡的演算法思想,將其放至合適位置。(效能較差,因為一次swap需要三次賦值)。

/*

插入排序改進版:減少了資料交換的次數。

*/template void insertionsortpro(t * arr, int n)

}

此版本**,內層使用的是,暫存當前的arr[i]到iback,然後依次向前比較,如果前面的大就把前面的賦值到當前位置,這樣只進行了一次賦值。

那麼如果n值較大的情況下,此**在賦值操作上的耗時是上面的冒泡版本的1/3。

3.氣泡排序法(bubble sort)

原演算法思想:逐次兩兩比較,把大的放右邊,這樣到最後,資料中最大的就到了右端。思想簡單,但是該演算法由於會進行大量swap,效率較低。

/*

氣泡排序法

*/template void bubblesort(t * arr, int n)

--n;

}}

4.希爾排序(shell sort)

原演算法思想:利用的插入排序的思想,以及優點和缺點進行的優化。先進行大步幅的插入排序,使得大體上變得更加有序,然後逐步減小步幅,直到整個有序。

大步幅為小步幅提供了更有序的資料,而進行大步幅的時候,又只對小資料量進行插入排序。(所以整體效能得到了提高)

主要是,利用插入排序對有序度較高的資料排序速度快的特點來優化的。當然步幅需要進行統計。才能取到最合適的步幅,並且效率期望最大。

/*

希爾排序

分析:優化原理:

由於插入排序法有適於排列較為有序的陣列,但是缺點是每次只能移動1格。那這樣遍歷乙個較長的陣列時會浪費很多時間。

如果先較大步的去讓整個陣列變得有序。那麼再減小步幅,這樣小步幅的效率就會因為插入排序法的特性而效率變高。

*/template void shellsort(t * arr, int n)

arr[j] = ttemp;

} iincriment /= 2;

}}

這些演算法中我最欣賞的思想是插入排序的思想和希爾排序的思想。

1.插入排序的思想是,

能利用已經得到的資訊來**結果實現跳過不必要的操作。(類似我們在字串匹配演算法的kmp演算法)

2.希爾排序的思想更讚,能結合演算法的優點缺點進行自身優化

(1)大步幅進行插入排序利用了,資料量較小時用時少。

(2)大步幅提供的更加有序的資料,為小步幅使用插入排序的優點(對較為有序的資料效率更高)提供了更好的基礎。

排序演算法(n 2級)

選擇排序 簡單選擇排序 void selectsort t arr,int n swap arr i arr minindex 插入排序 簡單插入排序 寫法一 void insertsort t arr,int n 寫法二 void insertsort t arr,int n arr j temp...

老生常談 排序演算法溫習一O n 2 級別

排序演算法是每乙個程式設計者 演算法學習者高階路上的必經之路,是演算法殿堂的入門和基石存在。對於找工作來說,排序也是被面試詢問比較頻繁的問題。其他的各種演算法題中,也會經常用到排序的預處理。話不多說開始正題。選擇排序,以公升序為例。對陣列做遍歷處理 索引i 每一輪遍歷過程中,向後和每乙個元素進行比較...

O n 2 級別的排序演算法

o n 2 的排序演算法。效能那麼差,為什麼還要學習?首先,它是基礎,千里之行,始於足下。它編碼簡單,容易實現,是一些簡單情景的首選,它能給我們的問題乙個暴力的解法,這樣的解法也許不是最優的,但是它能給我們想出其他的優化演算法一些啟發,思路。一 選擇排序 選擇排序是在給定的資料集合中,找出最小的值放...