一个快速排序(分类)及使用类似思想实现选择问题[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上出现了 ...
随机推荐
- GridLayout 使用
上次做了一个小键盘,请见:PopupWindow 使用. 效果是这样的: 可以看到,上面的按键是不一样大小的.因为是用LinearLayout布局,用的Button样式也是默认的.数字键和文字键的大小 ...
- Java与各种数据库连接代码
6.MySQL数据库Class.forName("org.gjt.mm.mysql.Driver").newInstance();String url ="jdbc:my ...
- HTML5的File API读取文件信息
html结构: <div id="fileImage"></div> <input type="file" value=" ...
- HTML5存储之 indexedDB
IndexeDB是HTML5 重要的一部分,它是一种轻量级的NOSQL数据库.对创建具有丰富本地存储数据的数据密集型的离线HTML5 Web 应用程序很有用. IndexedDB是为了能够在客户端存储 ...
- UEFI模式下Win10和Linux双系统
一.准备 用Win自带的磁盘管理或者进PE分出一块空间来. 你必须要有一个U盘,然后使用软碟通或者ImageWriter把iso系统镜像文件烧录进去,这是比较传统的方法,但既然我们UEFI启动,那就根 ...
- python之路十六
一.什么是DOM? 什么叫DOM,DOM是文档对象模型(Document Object Model,是基于浏览器编程(在本教程中,可以说就是DHTML编程)的一套API接口,W3C出台的推荐标准 ...
- VS Build目录下各文件的作用
VS2010中各种类型文件的作用: .sln 相当于VC6中 .dsw .vcxproj 相当于VC6中 .dsp .suo 相当于VC6中 .ncb .vcxproj.filter ...
- mysql 基础
(1)插入多条数据 INSERT INTO users(name, age) VALUES('姚明', 25), ('比尔.盖茨', 50), ('火星人', 600); (2)将查询出来的字段插入其 ...
- SB Admin 2 学习笔记1
需要掌握能够搭建起一个 dashboard 的能力, 因为很少有运维开发团队有专职的前端, bootstrap 也要讲个基本法. SB Admin 2, 一个免费的 bootstrap theme, ...
- SQL 基础
创建模式 create schema <schema_name> authorization <username> 没有指定schema_name时默认是用户名 删除模式 dr ...