同樣的先上這張圖
下面分析交換排序之快速排序:
快速排序的思想是先選擇乙個基準元素(一般取第乙個元素),然後對剩下的元素作兩端遍歷,左邊找到比基準元素大的元素,右邊找到比基準元素小的元素,兩者交換,重複下去直到low>high,再把基準元素跟high交換。這樣一遍下來,基準元素左邊的元素都比基準元素小,基準元素右邊的元素都比基準元素大。
然後對基準元素左邊和右邊分別作快速排序。
快速排序是通常被認為在同數量級(o(nlog2n))的排序方法中平均效能最好的。但若初始序列按關鍵碼有序或基本有序時,快排序反而蛻化為氣泡排序。一般公認的比較好的排序演算法是先用快速排序使序列基本有序,當快速排序遞迴到一定深度後轉為堆排序或插入排序,比如內省排序就是先快速後堆。
快速排序最好及平均情況時間複雜度為o(nlogn),最壞情況為o(n2)。
快速排序並不需要額外的空間,空間複雜度為o(1)。
快速排序是不穩定的。
as**:
/**
* 快速排序實現函式
* 先乙個基準,把小於基準的元素放到左邊,大於基準的元素放到右邊
* 返回基準
*/private function partition(arr:array,first:int,last:int):int
//找到第乙個比基準元素大的元素
while(low<=high && arr[low]<=privot)
if(lowarr[high])else
} /**
* 快速排序
*/private function quicksort(arr:array,low:int,high:int):void
}templateint sorthelp::partition(t l, int length, int low, int high)
while (low < high && l[low] <= l[pivot])
if (low < high)
}if (l[high] < l[pivot])
return pivot;
#else
int pivot = l[low];
while (low < high)
if (l[high] < pivot)
//從前面找小的數往後填補
while (low < high && l[low] <= pivot)
if (l[low] > pivot)
}//填補最後乙個元素並返回
l[high] = pivot;
return high;
#endif // 0
}
總結,快速排序的時間複雜度為o(nlogn),最壞情況下為o(n2),空間複雜度為o(1),不穩定。 排序演算法之快速排序
快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 從數列中挑出乙個元素,稱為 基準 pivot 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割槽退出...
排序演算法之快速排序
快速排序入口 public void quicksort int lists 遞迴呼叫該函式。原理 每次從陣列從選乙個標兵 本實現為簡單起見直接選取給定範圍內的第乙個元素為標兵 讓後在給定範圍內進行雙向遍歷,目的是以標兵為分界線,將所有小於標兵值的數字排一邊,將所有大於標兵的數字 放到另一邊。標兵移...
排序演算法之快速排序
快速排序是一種不穩定的排序演算法,它的基本思想是,以某個元素為基準,將所有大於等於它的值放在右邊,小於它的值放在左邊,這樣陣列就被分為兩部分,遞迴對這兩部分進行快速排序,而單個元素我們認為是已經排好序的。這是一種歸併思想,當然在最後一步,合併,我們什麼也沒有做也不用做。每一次排序都有乙個元素被放在正...