此篇文章中展示的**為 c 語言** ,陣列索引操作替換為指標操作。排序演算法可以分為兩類 : 一種為原地排序,除了函式呼叫所需要的棧和固定數目的示例之外無需額外的記憶體的。另一類為其他排序方法,即非原地排序。通常資料在資料庫中的儲存除分類外是按照時間順序生成的 ,例如乙個**系統的訂單資料首先是按照訂單生成的時間出現在資料庫中的,當按照訂單金額排序時 ,下單的時間也是乙個很重要的參考資料 ,如果在排序時改變了其先後順序 ,一方面做了無必要的記憶體消耗 ,另一方面改變了原始資料的排列 ,在下一次進行其他專案( 例如 :某使用者所有訂單按照金額和時間排序 )就要做更多的記憶體消耗。
滿序度,對於任意 n( 正整數 )個數排列的可能性有 n*(n-1)/2 種情況
有序度,即資料中順序正確的排列組合數
無序度,即無序的排列組合數
公式 :無序度 = 滿序度 - 有序度
對於任意排序 ,其實質就是將其無序排序變成有序排列的過程 ,即增加資料的有序度 、減少無序度 ,當無序度為 0 時排序完成 。
重點 :當資料排序操作的次數越接近無序度時 , 說明該演算法更好。
定義: 比較相鄰兩個數字的大小,滿足條件時位置不變,不滿足條件時交換其位置。
屬性:原地排序,大小一致時資料位置不發生改變。在陣列中 ,氣泡排序最好時間複雜度為 o(n) , 最壞時間複雜度為 o(n²) ,平均時間複雜度為 o(n)
void
bubblesort
(int
*nums,
int n)}if
(flag ==0)
//當flag為 0 則說明未交換,則剩下的都是有序數列不用再迴圈
break;}
}
定義:每次選擇( 最大或最小 )的數字放在末尾。
屬性:非原地排序,每次按順序從後面插入。在陣列中 ,選擇排序最好時間複雜度為 o(n²) , 最壞時間複雜度為 o(n²) ,平均時間複雜度為 o(n²)
void
choosesort
(int
*nums,
int n)}}
}
定義:將資料分成有序和無序兩部分,將無序部分資料插入至有序資料中按順序排列的位置,重複該過程直到無序部分資料為空。( 也滿足了分治法的思想 )
屬性:非原地排序 ,按大小插入到尾部 , 改變了資料原始的順序 ,進行了額外的資料操作。在陣列中 ,插入排序的最好時間複雜度為 o(n) ,最壞時間複雜度為 o(n²) ,平均時間複雜度為 o(n)
void
insertsort
(int
*nums,
int n)
else
break;}
*(nums + j+1)
= value;
}}
如果是交換鍊錶中結點的值 ,三種演算法的複雜度無變化 。氣泡排序複雜度不變 ,但因為鍊錶結點位置交換的操作更為複雜 ,所以對效能的消耗更大。
選擇排序複雜度不變 ,因為交換次數最多所以效能消耗更大。
插入排序插入資料時 ,陣列資料後移操作變簡單 ,相對來說效能消耗變小。
綜合來看 ,插入排序在三種初級排序演算法中有一定優勢( 在鍊錶等資料結構中演算法的時間複雜度有優化 ,而其他兩種的演算法複雜度無優化 ) ,所以在實際使用中插入排序更為常用。
三種氣泡排序
package com.wxh617.sort public class bubblesort public static void main string args 1.最簡單的氣泡排序演算法,沒有技術含量 本例中排序6趟 public static void bubblesort1 int a ...
三種基本排序
由於排序不僅是針對主關鍵字,那麼對於次關鍵字,因為待排序的記錄序列中可能存在兩個或者兩個以上的關鍵字相等的記錄,排序結果可能會存在不唯一的情況,所以我們給出了穩定與不穩定排序的定義。假設ki kj 1 i n,1 j n,i j 且在排序前的序列中 ri 領先於 rj 即i j 如果在排序後仍然領先...
三種排序演算法
1.氣泡排序法 2.選擇排序法 3.插入排序法 由小到大的順序 備註 網上筆試題,是參考網上別人的,具體出處找不到了,請諒解。摘抄記錄下來方便日後學習。如果有問題盡請批評指正,希望可以和大神一起交流。氣泡排序的最好的時間複雜度為o n 最壞的時間為 o n 2 演算法的平均時間複雜度為o n 2 選...