一、快速排序(快速分类)算法:

问题描述:给定线性集中n个元素和一个整数k,1<=k<=n,要求找出这n个元素中第k小的元素。

思想:选取数组A中的某个元素 t=A[s],然后将其他元素重新排列,使A中所有在t以前出现的元素都小于或等于t,而在t之后出现的元素都大于或等于t。这个重新整理的过程称为划分,t称为划分元素。

方法:分治法

算法(SPARKS):

 c++实现:

 #include<iostream>
 #include<cstdlib>
 #include<ctime>
 using namespace std;
 /*
 @快序排列算法的实现
 */
 int partition(int data[],int m,int p)///返回p,使得data[p]是第p小的值
 {
     int i=m,j=data[i];///j是划分元素
     bool flag=true;
     while(flag)
     {
         do
             i++;
         while(data[i]<j);
         do
             p--;
         while(data[p]>j);
         if(i<p)
         {
             int temp;
             temp=data[i];
             data[i]=data[p];
             data[p]=temp;
         }
         else
             flag=false;
     }
     data[m]=data[p];
     data[p]=j;
     return p;
 }
 void quicksort(int data[],int low,int high)
 {
     if(low<high)
     {
         ;
         temp=partition(data,low,temp);
         quicksort(data,low,temp-);
         quicksort(data,temp+,high);
     }
 }
 int main()
 {
 /*
 @产生一个规模为CNT的,范围为[RANDMIN,RANDMAX)的随机数组,并显示
 */
     int cnt,randmin,randmax;
     cout<<"Please Input 'CNT' 'RANDMIN' 'RANDMAX'"<<endl;
     cin>>cnt>>randmin>>randmax;
     const int CNT=cnt,
               RANDMIN=randmin,
               RANDMAX=randmax;
     int Data[CNT];
     srand((unsigned)time(NULL));
     ; i<CNT; i++)
         Data[i]=RANDMIN+rand()%(RANDMAX-RANDMIN);
     cout<<"Before Change,Data="<<endl;
     ; i<CNT; i++)
         cout<<Data[i]<<"    ";
     cout<<endl;
 /*
 @将数组用快速排序算法排序,并显示
 */
     quicksort(Data,,CNT-);
     cout<<"After Change,Data="<<endl;
     ; i<CNT; i++)
         cout<<Data[i]<<"    ";
     cout<<endl;
     ;
 }

算法分析:

最坏时间复杂度:O(n2)

平均时间复杂度:O(nlogn)

空间复杂度:O(n)[可通过有递归转变为迭代,达到O(logn)]

稳定度:不稳定

二、选择问题

问题描述:给定线性集中n个元素和一个整数k,1<=k<=n,要求找出这n个元素中第k小的元素。

思想:借助快速排序中的一次分划操作实现。

方法:二次取中法(分治法)

算法(SPARKS):

c++实现:

 #include<iostream>
 #define BIG 1024;
 using namespace std;
 ;
 ] {,,,,,,,,,,};
 int partition(int m,int p)///返回p,使得data[p]是第p小的值
 {
     int i=m,j=A[i];///j是划分元素
     bool flag=true;
     while(flag)
     {
         do
             i++;
         while(A[i]<j);
         do
             p--;
         while(A[p]>j);
         if(i<p)
         {
             int temp;
             temp=A[i];
             A[i]=A[p];
             A[p]=temp;
         }
         else
             flag=false;
     }
     A[m]=A[p];
     A[p]=j;
     return p;
 }
 int select(int k)
 {
     int m,r,j;
     m=;
     r=n;
     A[n]=BIG;
     bool flag=true;
     while(flag)
     {
         j=r;
         j=partition(m,j);
         if(k==j)
             flag=false;
         else if(k<j)
             r=j;
         else
             m=j+;
     }
     return A[j];
 }
 int main()
 {

     cout<<"Before Change,A="<<endl;
     ; i<n; i++)
         cout<<A[i]<<"    ";
     cout<<endl;
     cout<<"Please Input Your Choice(1-10)"<<endl;
     int s;
     cin>>s;
     cout<<"Your Choice: ";
     cout<<)<<endl;
     cout<<"After Change,A="<<endl;
     ; i<n; i++)
         cout<<A[i]<<"    ";
     cout<<endl;
 }

算法分析:

在最坏情况下,算法Select需要O(n2)计算时间
但可以证明,算法Select可以在O(n)平均时间内找出n个输入元素中的第k小元素。

一个快速排序(分类)及使用类似思想实现选择问题[c++实现]的更多相关文章

  1. 做一个logitic分类之鸢尾花数据集的分类

    做一个logitic分类之鸢尾花数据集的分类 Iris 鸢尾花数据集是一个经典数据集,在统计学习和机器学习领域都经常被用作示例.数据集内包含 3 类共 150 条记录,每类各 50 个数据,每条记录都 ...

  2. fastText、TextCNN、TextRNN……这里有一套NLP文本分类深度学习方法库供你选择

    https://mp.weixin.qq.com/s/_xILvfEMx3URcB-5C8vfTw 这个库的目的是探索用深度学习进行NLP文本分类的方法. 它具有文本分类的各种基准模型,还支持多标签分 ...

  3. 用 Java 实现一个快速排序算法

           快速排序是排序算法中效率最高的一种,它是利用递归的原理,把数组无限制的分成两个部分,直到所有数据都排好序为止. 快速排序是对冒泡排序的一种改进.它的基本思想是通过一趟排序将要排序的数据分 ...

  4. 用UWP实现一个和win10设置页面类似的布局

    不知道有人注意过Win10中的设置页面的布局没?那个页面会根据不同的窗口宽度来调节显示的内容,甚至来后退按钮的操作在不同的宽度也是不同的,看图: 是不是有点cool呢,这篇文章,我们就来做一个类似的布 ...

  5. magento的robots文件编写和判断是否是一个导航分类页面

    magento是网店系统,我们突出的是我们的产品,所以,有很多路径我们不想让搜索引擎索引到,所以我们需要用robots文件进行限制 下面是麦神magento的robots.txt里面的内容,因为很多u ...

  6. 转:一个C语言实现的类似协程库(StateThreads)

    http://blog.csdn.net/win_lin/article/details/8242653 译文在后面. State Threads for Internet Applications ...

  7. linq to sql用partial扩展属性,创建一个部分类(用于多表连接)

    1.在窗体中创建dataGridView显示表: using System; using System.Collections.Generic; using System.ComponentModel ...

  8. java算法面试题:设计一个快速排序。双路快速排序,简单易于理解。

    package com.swift; import java.util.ArrayList; import java.util.Collections; import java.util.Compar ...

  9. matlab使用libsvm入门教程——使用matlab安装配置libsvm以及一个svm分类实例

    前言 此教程专注于刚入门的小白, 且博客拥有时效性, 发布于2019年3月份, 可能后面的读者会发现一些问题, 欢迎底下评论出现的问题,我将尽可能更新解决方案. 我开始也在如何安装libsvm上出现了 ...

随机推荐

  1. 【bzoj1700】Problem Solving 解题

    题目描述 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地说,他们有P (1 <= P <= 300) 道题目要做. 他们还离开了农场并且象普通人一 ...

  2. ffmpeg为视频添加时间戳 - 手动编译ffmpeg

    FFMPEG给视频加时间戳水印 项目中需要给视频添加时间戳,理所当然最好用的办法是ffmpeg.在找到正确的做法前,还被网上的答案timecode给水了一下(水的不轻,在这里转了2天),大概是这样写的 ...

  3. Apache 配置多站点访问「为项目分配二级域名」

    一级域名(baidu.com)也叫作顶级域名,注册一级域名是需要付费的. 而二级域名(image.baidu.com)是一级域名的延伸,所以只要购买了一级域名,二级域名是可以任意配置的. 其实(www ...

  4. airflow 优化

    1. 页面默认加载数据过多,加载慢. 修改 .../python2.7/site-packages/airflow/www/views.py文件, 1823行, page_size参数, 比如改成18 ...

  5. Springboot快速入门创建

    maven构建项目 1.访问http://start.spring.io/,进入快速创建工程的主页 可参考下图所示: 2.选择构建工具Maven Project.Spring Boot版本1.3.6以 ...

  6. 解决mysql Table ‘xxx’ is marked as crashed and should be repaired的问题。

    解决mysql Table 'xxx' is marked as crashed and should be repaired的问题. 某个表在进行数据插入和更新时突然出现Table 'xxx' is ...

  7. redhat 配置本地yum源163yum源epel 源,无需卸载yum!无须拷贝ISO,愿网上少一点垃圾教程误人子弟

    都知道redhat不收费,但是其yum服务是要收费的,不想出钱那就自己配置yum源就好了. 首先,博主之前也没用过redhat,第一次用yum装包的时候提示什么没注册之类的,balaba一大堆,然后就 ...

  8. HTML 5 背离贪吃蛇 写成了类似于屏幕校准

    中间写了改 改了写 还是没做出自己满意的效果 ,看来自己的确不是一个走前端的料子.当然h5还是学一点好一点 具体说来 就是 在canvas 的画布中 鼠标点击后画上一个圆形 然后就有随机的在画布上面出 ...

  9. JavaScript通过ID获取元素坐标

    JavaScript通过ID获取元素坐标 function getElementPos(elementId) {    var ua = navigator.userAgent.toLowerCase ...

  10. UVA 11768 Lattice Point or Not(扩展欧几里德)

    将直线转化为ax + by = c的形式,然后扩展欧几里得求在[x1, x2]之间的解 对直线与坐标轴平行的特判 调试了好长时间,注意: 1 正负数转化为整型的处理 2 注意判断有无解 #includ ...