[C语言] 交换排序之快速排序的特性及实现
[C语言] 交换排序之快速排序的特性及实现
1、算法特性
快速排序是对冒泡排序的一种改进,是一种不稳定的交换排序方法。当数据量庞大且随机无序时,快排是当前最快的排序方式;但当数据量较小、数据基本有序时,快排甚至会退化成冒泡排序。
其时间复杂度最好、平均情况为O(nlog(2)n)、最差为O(n²),空间复杂度为O(nlog(2)n)。
2、算法思路
以升序排序为例,首先选取一个元素作为基准(通常选取数组两端的元素),通过算法将数组分割成所有元素均小于基准与所有元素均大于等于基准两个部分,这时基准元素处于二者之间,便完成一轮排序。然后再按照以上流程对两个部分分别进行新一轮的排序,通过递归使得整个数组有序。
3、实现代码
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 }
4、测试结果