C语言实现快速排序

来源:互联网 发布:产品数据图纸英语 编辑:程序博客网 时间:2024/06/06 00:09

基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。


动画展示了快速排序算法的工作原理:


实现代码:

#include <stdio.h>void quick_sort(int *a, int n){int i, j, p, tmp;if(n < 2) return ; //数组a元素个数小于2不用排序p = a[n / 2]; //获取数组中的中间位置的数据for(i = 0, j = n - 1; ; i++, j--) //对元素进行遍历, 排序{while(a[i] < p)i++;while(p < a[j])j--;if(i >= j)break;tmp = a[i];a[i] = a[j];a[j] = tmp;}//对数组进行分组排序quick_sort(a, i);quick_sort(a+i, n-i);}int main(){int a[] = {2, 5, 3, 1, 4};int n = sizeof a / sizeof a[0]; //获取元素个数int i;//打印数组afor(i = 0; i < n; i++)printf("%d%s", a[i], i == n-1 ? "\n" : " ");//排序quick_sort(a, n);//打印排序后的数组afor(i = 0; i < n; i++)printf("%d%s", a[i], i == n - 1 ? "\n" : " ");return 0;}

注意:我们在for循环中又进行啦while循环;
它的作用是对元素进行遍历,假设左边的数据没有p中保存的元素大,那么继续寻找,并且把i自增;
当找到比p大的或者相等得则停止第一个while循环;
例如:如果数组(2,5,3,1,4)那么p显然是3,当while循环发现5大于3时停止循环,此时i=1;
同理,第二个while循环中,p依然是3,当while循环第一次发现4大于3则继续循环此时j=4;
当while循环到j=3时,得到的元素是1,1不大于3所以停止循环,此时得到的j=3;

当i>=j意味着此时数据已经全部遍历完了;
因为i与j分布在数组左右两部分,当它们重合,当然也就表明它们遍历完啦;

0 0