快速排序
- 基本思想
- 通过一趟排序将待排序数据分割成独立的两部分,其中一部分的所有元素均比另一部分的元素小
- 然后分别对这俩个部分继续进行排序,重复上述步骤直到排序完成
- 实现描述
- 声明函数,参数,参数1:要排序的数组,参数2:数组下标左值(为0),参数3:数组下标右值(数组长度减1)
- 选取基准点,我们选择数组中居中的元素
- a.然后以基准点为标准,基准点左边的数从左向右开始寻找第一个大于基准点的数,然后停止
- b.接着继续以基准点为标准,基准点右边的数从右向左开始寻找第一个小于基准点的数,然后停止
- 然后将上述两个点的值进行交换(通过中间变量temp实现交换)
- 交换完成后继续进行a,b操作直到i>j为止,第一次排序结束:实现的结果是基准点左边的数都是比基准点小的,右边的都是比基准点大的
- 第一次排序结束之后,基准点左边的数都比基准点小,但是顺序并不规则,右边的也是
- 因此需要继续递归调用函数,缩小范围继续排序,直到全部排完
#include<stdio.h>
void q_sort(int array[],int left,int right){
int i=left,j=right;
int temp;
int pivot;//基准点
pivot=array[(left+right)/2];
while(i<=j){
//从左到右找到大于等于基准点的元素
while (array[i]<pivot){
i++;
}
//从右到左找到小于等于基准点的元素
while (array[j]>pivot){
j--;
}
if(i<=j){
temp = array[i];
array[i] = array[j];
array[j] = temp;
i++;
j--;
}
}
if(left<j){
q_sort(array,left,j);
}
if(i<right){
q_sort(array,i,right);
}
}
void main(){
int array[]={75,16,35,48,76,12,1,99,100,153,68,123,54,68};
int i,length;
length=sizeof(array)/sizeof(array[0]);
q_sort(array,0,length-1);
printf("排序后的结果是:");
for(i=0;i<length;i++){
printf("%d ",array[i]);
}
printf("\n");
}
排序后的结果是:1 12 16 35 48 54 68 68 75 76 99 100 123 153