快速排序算法及其思想的应用(寻找一个序列中第k小元素)

Posted 桂月二四

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序算法及其思想的应用(寻找一个序列中第k小元素)相关的知识,希望对你有一定的参考价值。

快速排序的本质就是通过特定的算法将一段无序的数列分割成独立的两部分,再对这两部分采用同样的算法递归处理,最终使得序列有序。
关键就在于这个特定的算法,具体实现起来,我们可以取序列中任意一个元素作为媒介,并把比其小的数字放在这个元素左边,把比其大的数字放在右边。
由于可以选取任意的元素作为媒介,所以快速排序就有了很多种不同的类型。 其中比较常见的就是把中间元素第一个元素作为媒介。

第一种快排:把中间元素作为媒介

核心代码: 前面一部分主要是实现以第(l+r)/2 个元素作为媒介, 并将比其小的元素放在前面,把比起小的元素放在后面这一过程,然后是递归操作。

void q_sort(int l,int r)

    int i=l,j=r,key = a[(l+r)/2];
    while(i<=j)
    
        while(a[i]<key)i++;
        while(a[j]>key)j--;
        if(i<=j)
        
            swap(a[i],a[j]);
            i++;j--;
        
     
    if(l<j)  q_sort(l,j);//l j i r
    if(i<r) q_sort(i,r); 

第二种快排

,以第一个元素作为媒介,具体实现起来和上面的差不多

void kuaipai(int l,int r)

	int i=l,j=r,key=a[i];
	while(i<j)
	
		while(i<j&&a[j]>=key)j--;
			a[i]=a[j];
		while(i<j&&a[i]<=key)i++;
			a[j]=a[i];
	
	a[i]=key;
	if(l<r)
	
		kuaipai(l,i-1);
		kuaipai(j+1,r);
	

快速排序在c++的stl模板库里就有,可是我们为啥还要学习呢?事实上。快速排序中的分治思想是及其重要的。
例题:寻找一个序列中第k小元素
题目描述
对于给定的含有n(n<=1000000)元素的无序序列,求这个序列中第k(1≤k≤n)小的元素。

输入
第一行为n,第二行为n个数。第三行为k的值。
输出
第k小元素的值
样例输入
10
243 3 4365 34 4365 21 234 1 234 3
5
样例输出
34

思路1:先排序后确定第k个数
复杂度 O(nlogn) 数据一大可能就炸了
思路2(分治算法):我们可以取序列中任意一个元素作为
媒介
,并把比其小的数字放在这个元素左边,把比其大的数字放在右边。
如果右边的数字个数等于k,那么选取的这个元素就是答案,
如果右边的数字个数大于k,则答案在右边,对右边递归
如果右边的数字个数小于k,则答案在左边,对左边递归
是不是很熟悉,事实上,思路二的第一段我是复制了上述快速排序的思路,我们只需要将快速排序的代码稍加修改即可得出程序
下面一第二种快排为例:

#include<bits/stdc++.h>
using namespace std;
int a[1000005],n,t;
int  kuaipai(int l,int r,int k)

    int i=l,j=r,key=a[i];
    while(i<j)
    
    while(i<j&&a[j]>=key)j--;
    a[i]=a[j];
    while(i<j&&a[i]<=key)i++;
    a[j]=a[i];
    
    a[i]=key;
    if(l<r)
    
        if(i-l+1==k)
        
            return key;
        
        else if(i-l+1>k)
            return kuaipai(l,i-1,k);
        else return kuaipai(i+1,r,k-(i-l+1));
    
     

int main()

 
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    int k;cin>>k;
    cout<<kuaipai(1,n,k); 
 return 0;

以上是关于快速排序算法及其思想的应用(寻找一个序列中第k小元素)的主要内容,如果未能解决你的问题,请参考以下文章

归并和快速排序思想的延伸

寻找第K大 —— 快排思想 / 堆排思想

寻找第K大 —— 快排思想 / 堆排思想

寻找第K大 —— 快排思想 / 堆排思想

寻找第K大 —— 快排思想 / 堆排思想

快速排序算法原理及其js实现