資料結構與演算法 快速排序

2021-09-18 01:27:39 字數 1652 閱讀 9818

基礎概念:快速排序,聽這個名字就能想到它排序速度比較快方法,是一種分治思想。

所謂分治,就是指以乙個數為基準,將序列中的其他數往它兩邊「扔」。以從小到大排序為例,比它小的都「扔」到它的左邊,比它大的都「扔」到它的右邊,然後左右兩邊再分別重複這個操作,不停地分,直至分到每乙個分割槽的基準數的左邊或者右邊都只剩乙個數為止。這時排序也就完成了。

例子:35,22,17,-20,48,99,46

通俗理解

選定乙個數作為比較數key(基數),比key小的放左邊,比key大的放右邊。

選定第乙個數:35。 第一趟排序後:-20,22,17,35,48,99,46

這個時候key的左邊都比key小,但還不是有序。就再次對key的左半部分執行1操作

(下標是:0~3的元素,也就是-20,22,17這三個元素,再這三個數中選定乙個key,比key小的放左邊,比key大的放右邊)

排序後:-20,17,22,35,48,99,46

35右邊的(48,99,46)三個數,執行相同操作

完成排序:-20,17,22,35,46,48,99

/**

**快速排序

*date: 2019/4/12

****/

#include // 快速排序

void quicksort(int *a, int low, int high)

while(low < high)

if(a[high] < key)

while(low < high && a[low] <= key)

if(a[low] > key)

} a[low] = key; // 第一輪排序完畢,當前位置就是key的位置(左邊都是小於key,右邊都是大於key)

quicksort(a,i,low-1); //遞迴呼叫(排序key左邊的子串行)

quicksort(a,low+1,j);

}// 遍歷陣列

void show(int *a,int n)

}void main();

int n = sizeof(a) / sizeof(a[0]); // 陣列長度

printf("原陣列:\n");

show(a,n);

quicksort(a,0,n-1);

printf("\n排序後的陣列:\n");

show(a,n);

printf("\n");

}

平均時間複雜度: o(nlogn)

空間複雜度: o(nlogn)

最優情況:

如果待排序列是「公升序有序」,如:1,2,3,4,5,6,7

那麼,快速排序為最優情況

最糟糕情況:

如果待排序列是「降序有序」,如:7,6,5,4,3,2,1

那麼,快速排序為退化為氣泡排序。

資料結構與演算法 排序演算法 快速排序

源 cpp view plain copy include void quicksort int int,int intfindposs int int,int intmain quicksort arry,0,6 printf after sorted n for i 0 i 7 i printf...

資料結構與演算法 快速排序

快速排序在實際應用中使用廣泛,效果也高。快排使用的是分治策略,一組序列基於某乙個基準值分成兩個大小的子串行,遞迴排序子串行,最終得到有序的序列。快排的平均時間複雜度為o nlogn 演算法的實現步驟 1.在序列中挑選乙個基準值,我們可以預設第乙個數為基準值 2.從兩邊的數值跟基準值作對比,數值小的放...

資料結構與演算法 快速排序

程式 package com.nicchagil.generics.study.no099快速排序 public class quicksort print array,left,right int standardindex left int standard array standardinde...