穩定:排序前a位於b前,且a=b,排序完後a仍然位於b前。
不穩定:排序前a位於b前,且a=b,排序完後a可能位於b後。
內排序:所有排序操作都在記憶體中完成;
外排序:由於資料太大,因此把資料放在磁碟中,而排序通過磁碟和記憶體的資料傳輸才能進行;
時間複雜度: 乙個演算法執行所耗費的時間。
空間複雜度:執行完乙個程式所需記憶體的大小。
n:資料規模
k:「桶」的個數
基本思想:選取乙個記錄作為基準,經過一趟排序,將整段序列分為兩個部分,其中一部分的值都小於基準,另一部分都大於基準。然後繼續對這兩部分繼續進行排序,直到整個序列達到有序,這是典型的分治思想。
步驟:(1)從數列中挑出乙個元素,稱為 「基準」(pivot);
(2)重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作;
(3)遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
此時50左邊都比基準小,右邊都比基準大,完成了第一趟排序。
然後遞迴地對左右兩部分進行排序,直到全部有序。
**實現:
package com.qcby.test;
/** * 快速排序演算法
*/public
class
quicksort
;quicksort
(data,
0, data.length-1)
;}private
static
void
quicksort
(int
data,
int left,
int right)
// 表示已找到
if(leftindex < rightindex)
// 從佇列前面往後找出比base 大的第乙個數
while
(leftindex < rightindex && data[leftindex]
<= base)
if(leftindex < rightindex)
}// 以基準數分為2部分, 前後部分遞迴排序
if(leftindex > left)
if(rightindex < right)
}/**
* 對換資料位置
效能分析:
快速排序的最好的情況(每次資料劃分得很均勻)時間複雜度為o(nlogn),最壞的情況(需排序的資料為正序或逆序排列時)複雜度為o(n^2)。
參考:
演算法1 排序
氣泡排序 氣泡排序,比較相鄰的元素由小到大排序 function bubblesort arr return arr view code 快速排序 以基數為標準,最右開始查小於基數停止,最左邊開始查大於基數停止,互換位置停止的位置 left right表示基數左為小於基數,基數右大於基數的 拆分基數...
演算法 排序1 排序
題目 給定n個 長整型範圍內的 整數,要求輸出從小到大排序後的結果。本題旨在測試各種不同的排序演算法在各種資料情況下的表現。各組測試資料特點如下 輸入第一行給出正整數n 10 5 隨後一行給出n個 長整型範圍內的 整數,其間以空格分隔。在一行中輸出從小到大排序後的結果,數字間以1個空格分隔,行末不得...
演算法導論 1 排序演算法
排序演算法是最基礎的一類演算法。主要排序演算法包括選擇排序 插入排序 氣泡排序 合併排序 堆排序和快速排序。把這些排序演算法全部實現一邊,再把 演算法導論 對應章節後面的習題做一遍,確實是系統學習演算法的乙個不錯的開端。選擇排序的想法很簡單,把需要排序的陣列看成一堆撲克牌 先查一遍,抽出最小的作為第...