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