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

问题描述:给定线性集中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. Python-pandas

    Python-pandas Python 中处理时间序列的主要工具是 pandas 库. 1.pannas 基础 1.1使用 DataFrame 类的第一步 #!/etc/bin/python #co ...

  2. JavaScript的==和===运算符

    JavaScript提供两个相等运算符:==和 ===.      简单说,它们的区别是相等运算符( ==)比较两个值是否相等,严格相等运算符( ===)比较它们是否为“同一个值”.如果两个值不是同一 ...

  3. 从SQL的视角用powershell

    SQL是数据处理中的利器,语法简单,表现力强.同时SQL作为说明型语言,让使用者关注在数据处理上.Powershell是微软提供的一个命令行工具.虽然在powershell中无法直接编写SQL,但是提 ...

  4. ajax——CORS跨域调用REST API 的常见问题以及前后端的设置

    RESTful架构是目前比较流行的一种互联网软件架构,在此架构之下的浏览器前端和手机端能共用后端接口. 但是涉及到js跨域调用接口总是很头疼,下边就跟着chrome的报错信息一起来解决一下. 假设:前 ...

  5. 使用KRPano资源分析工具还原全景图片

    软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278936(软件免费版本在群内提供) 最新博客地址:blog.turenlong.com 限时下载地址:htt ...

  6. c#反射机制

    一:反射的定义 审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等. Sys ...

  7. 第三天--html列表

    <!Doctype html><html>    <head>        <meta charset="utf-8">      ...

  8. linux部署pxe+kickstart批量安装linux操作系统

    环境 系统 centos6.6 无图形界面 ip 192.168.2.1 系统 centos7.2 有图形界面 以下命令在centos6.6上执行 1. yum -y install dhcp* tf ...

  9. js获取文档高度

    网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网页可见区域宽: document.body.offsetWi ...

  10. MySQL--InnoDB索引原理详解

    1 各种树形结构 本来不打算从二叉搜索树开始,因为网上已经有太多相关文章,但是考虑到清晰的图示对理解问题有很大帮助,也为了保证文章完整性,最后还是加上了这部分. 先看看几种树形结构: 1 搜索二叉树: ...