基礎概念:快速排序,聽這個名字就能想到它排序速度比較快方法,是一種分治思想。
所謂分治,就是指以乙個數為基準,將序列中的其他數往它兩邊「扔」。以從小到大排序為例,比它小的都「扔」到它的左邊,比它大的都「扔」到它的右邊,然後左右兩邊再分別重複這個操作,不停地分,直至分到每乙個分割槽的基準數的左邊或者右邊都只剩乙個數為止。這時排序也就完成了。
例子: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...