簡介:最簡單的插入排序,利用了這樣的事實:位置0—p的元素是排序的,後邊n-p+1個元素向前面已經
排序的元素中插入,需要巢狀迴圈,第一層p—n(p的初始值為1,即前乙個元素是排序的),第二層1—p,
即第一層每個元素需要跟已經排序的元素比較,進而在合適的位置插入,插入….biubiubiu
效率:由於是巢狀迴圈,每次都要n次比較,所以效率是(o (n*n))
穩定性:穩定的
看**:
void insertsort(int a, int n)
}
簡介:是衝破二次時間屏障的第一批演算法之一,原理:通過比較相距一定間隔的元素工作,各趟比較
所用的距離隨著演算法的進行而減小,知道只比較相鄰元素的最後一趟排序為止—在每個增量上進行一次子
陣列插入排序;
效率:o(nlogn)~o(n2),效率依賴增量的設計
穩定性:不穩定;原因:我們知道插入排序是穩定的,但是每個增量上的插入排序可能打亂穩定性
看**:
void shellsort(int a, int n)
// 在合適的位置插入
a[i] = tmp;}}
}
簡介:正如名字,實踐中最快的排序演算法;原理:選出乙個樞紐元素p,待排序陣列前後兩個標記i,j,
a[i]向後移動,a[j]向前移動,如果a[i] > p && a[j] < p 則交換i,j,那麼一趟排序後,資料被分為兩份,前邊的都小於樞紐元素,後邊的都大於樞紐元素,然後分而治之,分別對前後做相同的處理;
效率:(o(n*logn))
穩定性:不穩定
看**:
void quicksort(int a, int left, int right)
}// 一趟比較結束了,我們樞紐元素還在a[left]位置上
// 可以確定的是a[i] 一定是小於等於樞紐元素的,進行交換,這樣
// 樞紐左邊都是小於他的元素,右邊都是大於他的元素
a[left] = a[i];
a[i] = q;
// 分而治之
quicksort(a, left, i - 1);
quciksort(a, i + 1, right);
}
這裡有篇文章配圖講的挺形象的:
快排延伸:
(1)聽過這樣乙個問題,給你乙個大陣列,炒雞大(不能借助輔助陣列什麼的)!有奇數有偶數,
以o(n)時間複雜度,處理以下資料,使得左邊都是奇數,右邊都是偶數。看完快排很快就能想到解題思路,
即:省去「分治」的快排,具體就是定義兩個變數,分別從兩個方向同時遍歷資料,然後進行資料交換;
(2)實踐中,在對少量元素排序時(3 <= n <= 20),插入排序效率要高於快速排序,所以乙個改進的方式
是,快排中元素在比較少時,用插入排序;
不行,我還要默寫一遍快排,八嘎!
void quicksort(int a, int left, int right)
} a[left] = a[low];
a[low] = tmp;
quicksort(a, left, low - 1);
quicksort(a, low + 1, right);
}
// todo 常見排序總結
選擇排序 每一趟選取第i個關鍵字,與剩下的n i關鍵字進行比較,找出最大的值與剛開始選擇的i下標對應的值交換 第一趟 0 1 n 1 第二趟 1,2 n 1 應用場景 最好最壞情況時間複雜度都是o n 2 空間複雜度為o 1 最壞情況 對相對有序的一組資料排序 不穩定 由其交換引起的 適用於數量不大...
常見的排序演算法總結
include 演算法只是比較了元素為整數的內容.大部分的排序只是做了簡單的測試.僅供參考.void swap int a int b bool less int a,int b 對內部中的元素先找到k值,然後分兩塊 int partition int r,int lo,int hi while j...
常見的排序演算法總結
平時一直做專案,業務邏輯,對演算法這塊逐漸有了生疏 今天有空總結一下排序演算法 1 氣泡排序 氣泡排序的原理就是兩兩相比,從小到大的話前面比後面大就交換,從大到大的話前面比後面小就交換,比如有一組數 1,10,5,3,2 如何對它做排序 比如從小到大 第一步 1,10,5,3,2 源資料 1,10,...