快速排序是对冒泡的一种改进
基本思想:通过一趟排序将数据分为两个部分,一部分的所有数据要比另一部分的所有数据都要小,然后再按此方法对两部分数据分别进行快速排序,整个过程可通过递归实现。
实现过程:
对于数据A[0],….A[n-1],首先任意选取一个数据(通常选第一个)作为关键数据,将所有比它小的防到它前面,大的放在后面,这一趟称为快速排序
一趟排序的过程:
1.设置两个变量I,j。 i=0,j=N-1。
2.以第一个元素作为关键数据,赋值给key,key=A[0];
3.从j往前搜索,j--,找到第一个小于key的数A[j],将A[j],A[i]互换
4.从i往后搜索,i++,找到第一个大于key的数A[i],互换A[i],A[j]
5.重复3,4步,直到i==j。
上面就是一趟排序的过程,为了得到最后结果,需要对两边的数组再进行排序,然后再分解数组,直到数组不能分解为止(只有一个数据),整个过程就是递归。
c++可以用函数qsort()直接为数组进行快速排序,也就是封装了快速排序的算法。
用 法:
void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));
参数:
1 待排序数组首地址
2 数组中待排序元素数量
3 各元素的占用空间大小
4 指向函数的指针,用于确定排序的顺序
#include <stdio.h>
#include <stdlib.h>
void sort(int *a, int left, int right){
if(left>=right) //表明数据只有一个元素了,完成
return;
int i=left;
int j=right;
int key=a[left];
while(i<j){ /*控制在当组内寻找一遍*/
while(i<j && key<=a[j])
j--;
a[i]=a[j];
while(i<j && key>=a[i])
i++;
a[j]=a[i];
}
a[i]=key;/*当在当组内找完一遍以后就把中间数key回归*/
sort(a, left, i-1); //左边数组继续排序,i是不用排的
sort(a,i+1,right); //右边数组继续排序,i是不用排的
}