c語言實現快速排序
阿新 • • 發佈:2019-02-01
快速排序
時間複雜度:最好時間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;
}