C语言——快速排序法!
C语言中有8大排序法,这一篇博客就来讲述一下快速排序法。
讲到快速排序就得小提一下递归函数,这是快速排序不可或缺的函数。递归函数简单来说就是自己调用自己的函数,在我的另一篇博客中有一些运用递归函数的例子。
下面来阐述一下快速排序的思路:
随便给几个数字
4 7 3 9 2 6 5 0 1 8
left right 对 [ left , rifht ] 区间数字进行排序
假定一个中间值key = arr[ left ]; 为4
x1 x2 x3 … 4 y1 y2 y3 …
最终目的是让4左边的数都小于4,右边的数都大于4
从右边找一个比4小的数 放在i下标处
1 7 3 9 2 6 5 0 1 8
i-----------------------j
从在边找一个比4大的数 放在j下标处
1 7 3 9 2 6 5 0 7 8
----i ------------ j
1 0 3 9 2 6 5 0 7 8
—i-------------- j
----------i
1 0 3 9 2 6 5 9 7 8
----------i ------ j
----------j
1 0 3 2 2 6 5 9 7 8
----------ij
1 0 3 2 4 6 5 9 7 8
将key=4插入i的位置
最后i和j重合的时候就达成了最初的目标。
代码如下:
#include <stdio.h>
void quickSort(int arr[],size_t left,size_t right){
if(left >= right){
return;
}
int key = arr[left];//标准key 放在合适的位置 使得左边的元素全部<=key 右边全部的元素>=key
int i=left,j=right;
while(i<j){
//右边找一个比key小的
while(i<j && arr[j]>=key){
--j;
}//循环退出arr[j]<key
arr[i] = arr[j];
while(i<j && arr[i]<=key){
++i;
}
arr[j] = arr[i];
}
arr[i] = key;
if(i-left>1){
quickSort(arr,left,i-1);
}
if(right-i>1){//right-i>1
quickSort(arr,i+1,right);
}
}
void quick(int arr[],size_t n){
quickSort(arr,0,n-1);
}
int main(){
int arr[] = {8,2,3,9,0,3,2,4,8,6,4,5,7,0,1,3,5};
quick(arr,sizeof(arr)/sizeof(arr[0]));
int i = 0;
for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
printf("%d ",arr[i]);
printf("\n");
return 0;
}
注意:我这个代码是在Linux环境下实现的 在windows下编译可能会有乱码,将代码中的汉字换掉就好了。