快速排序(详解)

描述:

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

快速排序 的平均时间复杂度为O(NlogN),是冒泡排序的一种改进版。

方法:快速排序主要采用“二分”的思想,步骤如下:

1)  设置两个变量i、j,排序开始的时候:i=0,j=n-1;

2)第一个数组值作为比较值,首先保存到temp中,即temp=A[0];

3)然后j-- ,向前搜索,找到小于temp后,因为s[i]的值保存在temp中,所以直接赋值,s[i]=s[j]

4)然后i++,向后搜索,找到大于temp后,因为s[j]的值保存在第2步的s[i]中,所以直接赋值,s[j]=s[i],然后j--,避免死循环

5)重复第3、4步,直到i=j,最后将temp值返回s[i]中

6)  然后采用“二分”的思想,以i为分界线,拆分成两个数组 s[0,i-1]、s[i+1,n-1]又开始排序

如下图,以数组 6 4 7 1 2为例:

代码如下:

#include "stdio.h"
void find_frst(int *s,int lift,int right)
{
    int i=lift,j=right,temp;  //(1)初始化i、j    
    if(lift>=right) 
     return ;
    temp=s[i];                //(2)以第一个数组为比较值,保存到temp中 
    while(i<j)
    {    
      while(j>i&&s[j]>=temp)  //(3)j--,找小值 
      j--;
      s[i]= s[j];             //保存小值,到s[i]上 
       
      while(i<j&&s[i]<=temp)  //(4)i++,找大值 
      i++;
      s[j--]=s[i];            //保存大值 到s[j]上 
    }
    s[i]=temp;             //(5)将比较值放在s[i]上 
        
  /*(6)拆分成两个数组 s[0,i-1]、s[i+1,n-1]又开始排序 */
  find_frst(s,lift,i-1);         //左
  find_frst(s,i+1,right);        //右     
}
int main()
{
    int i=0,s[100],n;
    scanf("%d",&n);        //输入数组长度
    for(i=0;i<n;i++)
    scanf("%d",&s[i]);    
    find_frst(s,0,n-1);  
    for(i=0;i<n;i++)
    printf("%d ",s[i]);      //打印
    printf("\n");
} 

既然有了排序,那么还有可能用到查找,在有序条件下,当然用二分查找快咯,即简单又速度快

代码如下:

#include "stdio.h"

/*快速排序  */
void find_frst(int *s,int lift,int right)
{
    int i=lift,j=right,temp;  //(1)初始化i、j    
    if(lift>=right) 
     return ;
    temp=s[i];                //(2)以第一个数组为比较值,保存到temp中 
    while(i<j)
    {    
      while(j>i&&s[j]>=temp)  //(3)j--,找小值 
      j--;
      s[i]= s[j];             //保存小值,到s[i]上 
       
      while(i<j&&s[i]<=temp)  //(4)i++,找大值 
      i++;
      s[j--]=s[i];            //保存大值 到s[j]上 
    }
    s[i]=temp;             //(5)将比较值放在s[i]上 
        
  /*(6)拆分成两个数组 s[0,i-1]、s[i+1,n-1]又开始排序 */
  find_frst(s,lift,i-1);         //左
  find_frst(s,i+1,right);        //右     
}


/*二分查找 
 *s[]:数组        size:数组个数   cmp:需要比较的数字     
 *返回值:表示数组的第几个,返回-1表示没有找到 
 */
int binary_query(const int* s, int size, int cmp)  
{  
    int low = 0;  
    int high = size;
    int mid;              //中间值 
    while(low<=high)  
    {  
        mid = (low+high)/2;  
        if(s[mid] == cmp)  
            return mid;  
        else if(s[mid] > cmp)  
            high = mid-1;  
        else  
            low = mid+1;  
    }  
    return -1;  
}  
int main()
{
    int i=0,s[100],n,tmp,index;    
    scanf("%d",&n);             //输入:数组长度 
    for(i=0;i<n;i++)
    scanf("%d",&s[i]);        //输入:数组数据 
    find_frst(s,0,n-1);
    
    printf("find_frst:\n",s[i]);       
    for(i=0;i<n;i++)    
    printf("%d ",s[i]);      //打印:有序数组 
    printf("\n");
    
    scanf("%d",&tmp);             //输入:要查找的数据
    index=binary_query(s,n,tmp);
    if(index<0)    
    printf("ERR,The value is not querying\n");    
    else
    printf("index=%d\n",index);
    
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏进击的君君的前端之路

面向对象、this

12530
来自专栏云霄雨霁

字符串查找----三向单词查找树

21310
来自专栏代码世界

Python基础数据类型之集合以及其他和深浅copy

一、基础数据类型汇总补充 list  在循环一个列表时,最好不要删除列表中的元素,这样会使索引发生改变,从而报错(可以从后向前循环删除,这样不会改变未删元素的索...

31390
来自专栏CVer

排序算法 | 冒泡排序(含C++/Python代码实现)

排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。排序算法有很多,本文将介绍最经典的排序算法:冒泡排序...

14220
来自专栏Python

Python常见数据结构整理 Python常见数据结构整理

Python常见数据结构整理 Python中常见的数据结构可以统称为容器(container)。序列(如列表和元组)、映射(如字典)以及集合(set)是三类主要...

20070
来自专栏土豆专栏

Java面试之数组

Array:它是数组,申明数组的时候就要初始化并确定长度,长度不可变,而且它只能存储同一类型的数据,比如申明为String类型的数组,那么它只能存储S听类型数据...

21740
来自专栏null的专栏

挑战数据结构与算法面试题——统计上排数在下排出现的次数

题目来源“数据结构与算法面试题80道”。在此给出我的解法,如你有更好的解法,欢迎留言。 ? 分析: 本题应该是一个确定的问题,即上排的是个数是题目中给定的...

33160
来自专栏猿人谷

不用加减乘除做加法

题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷四则运算符号。 分析: 第一步:不考虑进位对每一位相加。0加0、1加1的结果都是0,0加1...

22470
来自专栏lgp20151222

排序算法对比,步骤,改进,java代码实现

发现是时候总结一番算法,基本类型的增删改查的性能对比,集合的串并性能的特性,死记太傻了,所以还是写在代码里,NO BB,SHOW ME THE CODE!

10120
来自专栏python3

python3--小数据池,is,字符编码

python3x中的str在内存中的编码方式是unicode. python3x中的str不能直接存储和发送

22810

扫码关注云+社区

领取腾讯云代金券