快速排序
先找到一个数作为基准点,大于基准点的数放到右边,小于或等于基准点的数放在左边,然后再使用递归,在基准点左右两边进行相同的操作,当递归进入的数只有一个时可以停止递归。
如何实现将小于或等于基准点的数放左边,大于基准点的数放右边?
为了方便,选取数组第一个数作为基准点。
使用两个哨兵,分别从数组的两边出发,发现不符合条件的点就立刻停下。当两个哨兵都停下时则交换哨兵对应的两点。
当两个哨兵碰面时则交换基准点和哨兵对应的数。
可以看出快速排序在最差情况下时间复杂度为O(N2),但它比冒泡排序要快很多,因为冒泡排序只是交换相邻的点儿快速排序却跳跃性的交换两边的点。
1 #include <stdio.h> 2 #include <stdlib.h> 3 int a[8]={1,3,3,67,23,214,5,3}; 4 void quicksort(int start,int over) 5 { 6 int key=a[start],change; 7 int x=start,y=over; 8 if(x>=y)return; 9 while(1) 10 { 11 if(a[y]>key) 12 y--; 13 else if(a[x]<=key) 14 x++; 15 else 16 { 17 change=a[x]; 18 a[x]=a[y]; 19 a[y]=change; 20 } 21 if(x==y)break; 22 } 23 a[start]=a[x]; 24 a[x]=key; 25 quicksort(start,x-1); 26 quicksort(x+1,over); 27 } 28 int main() 29 { 30 int i; 31 quicksort(0,7); 32 for(i=0;i<8;i++) 33 printf("%d ",a[i]); 34 return 0; 35 }