快速排序思想及C语言代码
2017-04-20 20:20
232 查看
快速排序的思想(以从小到大为例)
(1)第一次排序
选取数组内的一个元素作为标准,将数组分为两部分;将小于该标准的元素存放在该标准的左边,大于该标准的元素放在右边,完成第一次排序;
(2)第二次排序
对分割后的两部分数组分别进行排序(递归的调用)。
基本方法
1)创建函数,传递的参数分别是数组的地址,数组首个元素的位置,数组元素的末位置;
2)在函数中声明三个变量x、begin、end(x用来取为标准元素,begin、end分别用来接收传参的后两个数值作为记录循环的位置);
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)。
(1)第一次排序
选取数组内的一个元素作为标准,将数组分为两部分;将小于该标准的元素存放在该标准的左边,大于该标准的元素放在右边,完成第一次排序;
(2)第二次排序
对分割后的两部分数组分别进行排序(递归的调用)。
基本方法
1)创建函数,传递的参数分别是数组的地址,数组首个元素的位置,数组元素的末位置;
2)在函数中声明三个变量x、begin、end(x用来取为标准元素,begin、end分别用来接收传参的后两个数值作为记录循环的位置);
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)。
相关文章推荐
- leetcode 27. Remove Element(C语言,快速排序思想,剔除数组中与目标值相等的数)20
- 快速排序的C语言代码实现
- 快速排序的c语言实现代码
- 快速排序基本思想以及代码实现
- 优化快速排序 C语言代码
- 快速排序的C语言代码实现
- 简单的C语言快速排序实现代码
- 快速排序的分析及c语言代码
- c语言快速排序代码
- 堆排序主要思想 -- 代码实现(C语言)
- 经典排序思想,并用C语言指针实现排序算法
- 快速排序的递归和非递归实现 -----C++、JAVA代码实现
- leecode 169. Majority Element(C语言,快速排序,堆排序,各类排序算法复杂度比较)22
- 快速排序和二分查找算法的实现C语言
- 排序--插入排序、希尔排序、快速排序、桶排序(代码)
- (数据结构排序的实验四)快速,冒泡,简单选择,直接插入排序的c语言实现!!
- JS实现随机化快速排序的实例代码
- 快速排序思想分析
- 快速排序分析与C语言实现
- python简洁代码实现快速排序