您的位置:首页 > 编程语言 > C语言/C++

快速排序思想及C语言代码

2017-04-20 20:20 232 查看
快速排序的思想(以从小到大为例)
(1)第一次排序
选取数组内的一个元素作为标准,将数组分为两部分;将小于该标准的元素存放在该标准的左边,大于该标准的元素放在右边,完成第一次排序;
(2)第二次排序
对分割后的两部分数组分别进行排序(递归的调用)。
基本方法
1)创建函数,传递的参数分别是数组的地址数组首个元素的位置数组元素的末位置
2)在函数中声明三个变量xbegin、end(x用来取为标准元素beginend分别用来接收传参的后两个数值作为记录循环的位置);
3)我先将数组的首个元素作为标准元素(即x=str[begin]),先从数组的末位置开始与x进行比较,如果小于x则进行交换;再从数组的首位置开始与x进行比较,如果大于x则进行交换,直到begin>=end;完成第一次排序;
4)前三个步骤完成后,数组被分为两部分:一部分是小于标即准元素,一部分是大于标准元素。将左右两部分分别进行排序(即调用创建的函数),完成第二次排序。

例:待排序的数组str:42,25,56,34,21
#include<stdio.h>
#include<stdlib.h>
void QuickSort(int str[],int i,int j)
{
int begin=i,end=j;
int x=str[i];
if(begin<end)
{
while(begin<end)
{
while(begin<end&&str[end]>x)
end--;
if(begin<end)
str[begin++]=str[end];
while(begin<end&&str[begin]<x)
begin++;
if(begin<end)
str[end--]=str[begin];
}
str[begin]=x;
QuickSort(str,i,end-1);//用递归将选取的标准数左右两边都进行排序
QuickSort(str,begin+1,j);
}
}
int main()
{
int str[5]={42,25,56,34,21};
int i=0,j=4;
QuickSort(str,i,j);
for(i=0;i<5;i++)
printf("%3d",str[i]);
}


基本方法2
第二种方法与第一种方法的思路大致相同,两者的区别在于交换数据的时候,第一种是先在右边开始找到第一个交换的数字,在交换后再从左边进行交换,通过x记录了被覆盖的str[0],直到i=j;第二种方法因为选择的也是str[0]作为标准,然后也是右边即end先走找到小于str[0]的数字后,begin再开始走,直到找到大于str[0]的数字,用三步法进行交换,这种方法比较简单易懂。
例:待排序的数组str:42,2556,34,21#include<stdio.h>
#include<stdlib.h>
void QuickSort(int str[],int i,int j)
{
int begin=i,end=j;
int x=str[i];
if(begin > end) return;
while(begin<end)
{
while(begin<end&&str[end]>x)
end--;
while(begin<end&&str[begin]<x)
begin++;
if(begin<end)
{
int temp=str[end];
str[end]=str[begin];
str[begin]=temp;
}
QuickSort(str,i,begin - 1);
QuickSort(str,end + 1,j);
}
}
int main()
{
int str[]={42,25,56,34,21};
int i=0,j=4;
QuickSort(str,i,j);
for(i=0;i<5;i++)
printf("%3d",str[i]);
return 0;
}




快速排序的作用
相对于冒泡排序而言,每次交换都是跳跃式的,不像冒泡排序一样只能在相邻的两个数之间进行交换,交换的次数较少,提高了程序的运行速度。在最差的情况下,时间复杂度仍和冒泡排序一样是O(N^2),但是平均复杂度O(NlonN)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: