一个快速排序(分类)及使用类似思想实现选择问题[c++实现]
一、快速排序(快速分类)算法:
问题描述:给定线性集中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++实现]的更多相关文章
- 做一个logitic分类之鸢尾花数据集的分类
做一个logitic分类之鸢尾花数据集的分类 Iris 鸢尾花数据集是一个经典数据集,在统计学习和机器学习领域都经常被用作示例.数据集内包含 3 类共 150 条记录,每类各 50 个数据,每条记录都 ...
- fastText、TextCNN、TextRNN……这里有一套NLP文本分类深度学习方法库供你选择
https://mp.weixin.qq.com/s/_xILvfEMx3URcB-5C8vfTw 这个库的目的是探索用深度学习进行NLP文本分类的方法. 它具有文本分类的各种基准模型,还支持多标签分 ...
- 用 Java 实现一个快速排序算法
快速排序是排序算法中效率最高的一种,它是利用递归的原理,把数组无限制的分成两个部分,直到所有数据都排好序为止. 快速排序是对冒泡排序的一种改进.它的基本思想是通过一趟排序将要排序的数据分 ...
- 用UWP实现一个和win10设置页面类似的布局
不知道有人注意过Win10中的设置页面的布局没?那个页面会根据不同的窗口宽度来调节显示的内容,甚至来后退按钮的操作在不同的宽度也是不同的,看图: 是不是有点cool呢,这篇文章,我们就来做一个类似的布 ...
- magento的robots文件编写和判断是否是一个导航分类页面
magento是网店系统,我们突出的是我们的产品,所以,有很多路径我们不想让搜索引擎索引到,所以我们需要用robots文件进行限制 下面是麦神magento的robots.txt里面的内容,因为很多u ...
- 转:一个C语言实现的类似协程库(StateThreads)
http://blog.csdn.net/win_lin/article/details/8242653 译文在后面. State Threads for Internet Applications ...
- linq to sql用partial扩展属性,创建一个部分类(用于多表连接)
1.在窗体中创建dataGridView显示表: using System; using System.Collections.Generic; using System.ComponentModel ...
- java算法面试题:设计一个快速排序。双路快速排序,简单易于理解。
package com.swift; import java.util.ArrayList; import java.util.Collections; import java.util.Compar ...
- matlab使用libsvm入门教程——使用matlab安装配置libsvm以及一个svm分类实例
前言 此教程专注于刚入门的小白, 且博客拥有时效性, 发布于2019年3月份, 可能后面的读者会发现一些问题, 欢迎底下评论出现的问题,我将尽可能更新解决方案. 我开始也在如何安装libsvm上出现了 ...
随机推荐
- Ubuntu下安装QQ22013
近期闲来无事,把退役的笔记本系统换成了Ubuntu. 系统安装异常的顺利,神速的安装完成.玩弄一会发现总是缺少了点什么,呆了半天发现缺少了企鹅. 由于对Ubuntu系统不了解,安装QQ着实让我头疼了半 ...
- 【转】PHP网站(nginx、php-fpm、mysql) 用户权限解析
这篇文章我们就特别来讲解下,nginx.php-fpm 以及 mysql 运行在各个用户下的配置. 先来做个说明:nginx本身不能处理PHP,它只是个web服务器.当接收到客户端请求后,如果是php ...
- jvm--4垃圾收集
6. 垃圾收集GC (1)当需要排查各种内存溢出,内存泄漏等问题,当GC成为系统达到更高性能的瓶颈时,我们就需要对这些自动化的GC进行监控和调节. (2)PC计数器.本地方法栈.虚拟机栈,随方法或者线 ...
- Android——SharedPreferences
SharedPreferences是一种轻型的Android数据存储方式,用来保存应用的一些常用配置. 实现SharedPreferences存储的步骤如下: 1.根据Context获取SharedP ...
- nodejs express下使用redis管理session
Session实现原理 实现请求身份验证的方式很多,其中一种广泛接受的方式是使用服务器端产生的Session ID结合浏览器的Cookie实现对Session的管理,一般来说包括以下4个步骤: 服务器 ...
- 优先队列实现Huffman编码
首先把所有的字符加入到优先队列,然后每次弹出两个结点,用这两个结点作为左右孩子,构造一个子树,子树的跟结点的权值为左右孩子的权值的和,然后将子树插入到优先队列,重复这个步骤,直到优先队列中只有一个结点 ...
- word20161219
Remote Installation Services / 远程安装服务 remote procedure call, RPC / 远程过程调用 remote storage / 远程存储 Remo ...
- 架构和模式的区别:三层架构和MVC在应用开发中的位置
架构是系统层面的,可以是多层架构,也可以是事件驱动架构,也可以是微服务架构. 模式是GUI应用的一种职责分离设计. 三层架构(包含多层架构)和 MVC模式(包含MVP, MVVM) 没什么关系,它们不 ...
- PHP window下安装Spl_Types模块
1. Window下,Spl_Types的模块的下载地址:http://pecl.php.net/package/SPL_Types/0.4.0/windows 2. php的可执行文件已经加到系统的 ...
- Python flask @app.route
转载自 http://python.jobbole.com/80956/ 下面是Flask主页给我们的第一个例子,我们现在就由它入手,深入理解“@app.route()”是如何工作的. ...