[C語言] 交換排序之快速排序的特性及實現算法
一、算法特性數組
快速排序是對冒泡排序的一種改進,是一種不穩定的交換排序方法。當數據量龐大且隨機無序時,快排是當前最快的排序方式;但當數據量較小、數據基本有序時,快排甚至會退化成冒泡排序。測試
其時間複雜度最好、平均狀況爲O(nlog(2)n)、最差爲O(n²),空間複雜度爲O(nlog(2)n)。ui
二、算法思路spa
以升序排序爲例,首先選取一個元素做爲基準(一般選取數組兩端的元素),經過算法將數組分割成全部元素均小於基準與全部元素均大於等於基準兩個部分,這時基準元素處於兩者之間,便完成一輪排序。而後再按照以上流程對兩個部分分別進行新一輪的排序,經過遞歸使得整個數組有序。code
三、實現代碼blog
1 #include <stdio.h> 2 3 // 快速排序的基礎:每個數據都應該有一個合適的位置 使左邊的數小於或等於這個數,右邊的數大於或等於這個數 4 void _quick_sort(int arr[],int left,int rigth) 5 { 6 int key = arr[left]; 7 int i=left; 8 int j=rigth; 9 while(j > i) 10 { 11 for(; j>i && arr[j]>=key; j--);// 沒有循環體 12 if(j > i) 13 arr[i] = arr[j]; 14 15 for(; j>i && arr[i]<=key; i++); 16 if(j > i) 17 arr[j] = arr[i]; 18 } 19 arr[i] = key; 20 if(i-1 > left) 21 _quick_sort(arr,left,i-1); 22 if(i+1 < rigth) 23 _quick_sort(arr,i+1,rigth); 24 } 25 26 void quick_sort(int arr[],int len) 27 { 28 _quick_sort(arr,0,len-1); 29 } 30 31 void travel(int arr[],int len) 32 { 33 for(int i=0;i<len;i++) 34 { 35 printf("%d ",arr[i]); 36 } 37 printf("\n"); 38 } 39 40 int main() 41 { 42 int arr[] = {53,82,9,233,43,14,55,9,4,67}; 43 int len = sizeof(arr)/sizeof(arr[0]); 44 45 /* travel(arr,len); 46 bubble_sort(arr,len); 47 travel(arr,len);*/ 48 49 travel(arr,len); 50 quick_sort(arr,len); 51 travel(arr,len); 52 53 return 0; 54 }
四、測試結果排序