1. 程式人生 > >c語言實現快速排序

c語言實現快速排序

快速排序
時間複雜度:最好時間O(nlogn) 最壞時間O(n^2)
穩定性:不穩定 快速排序不是一種穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算法結束時產生變動
基本思想:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,
然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。
實現方法:首先任意選取一個數據(通常選用陣列的第一個數)作為關鍵資料,然後將所有比它小的數都放到它前面,
所有比它大的數都放到它後面,這個過程稱為一趟快速排序。

//程式碼實現: 
#include <stdio.h>  
#include <stdlib.h> 
//實現交換  
void Swap(int a[] ,int low ,int high) { int tmp; tmp=a[low]; a[low]=a[high]; a[high]=tmp; } /************************************************************************** 函式名:partition() 功能: 計算基準點的函式,並將小於基準點的元素放於基準點的左邊,大於基準點的數放於基準點右邊 輸入引數: int a[]:待排序的陣列 int low:陣列的起始位置 int high:陣列的結束位置 返回值:int 基準點 *************************************************************************** */
int partition(int a[],int low,int high) { int point; //基準點定位為第一個元素 point=a[low]; while( low < high) { //將大於基準點的數放於基準點的右邊 while( low < high && a[high] >= point ) high--; //移到前一個元素 //當不滿足大於基準點,交換基準點 Swap(a,low,high); //將小於基準點的數放於基準點的左邊
while( low < high && a[low] <= point) low++; //移到下一個元素 //當不滿足小於基準點,交換基準點 Swap(a,low,high); } return low;//返回的中間點,當退出迴圈後low 與high指向同一個元素 } //low 為陣列起始位置 high為陣列的結束位置 void QSort(int a[],int low,int high) { int point;//定義變數存放基準點 if( low < high ) { point=partition(a,low,high);//對基準點定位 //對基準點左邊進行遞迴呼叫 QSort(a,low,point-1); //對基準點右邊進行遞迴呼叫 QSort(a,point+1,high); } } //外層函式,由於快速排序需要三個引數,為零滿足只要兩個引數,定義一個外層函式呼叫實際操作的函式 void QuickSort(int a[],int len) { //呼叫實際操作的函式 QSort(int a[],0,len-1); } int main(int argc, char const *argv[]) { int array[]={123,456,12,3,456}; QuickSort(array,5); int i; for(i=0;i<5;i++) { printf("%d ",array[i]); } return 0; }