【编程练习】快速select算法的实现
代码来自:
算法思想:
// Quick_select.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
#include <time.h> using namespace std; const int num_array = 13;
const int num_med_array = num_array/5 + 1; int array[num_array];
int midian_array[num_med_array]; /*
//插入排序算法伪代码
INSERTION-SORT(A) cost times
1 for j ← 2 to length[A] c1 n
2 do key ← A[j] c2 n - 1
3 Insert A[j] into the sorted sequence A[1 ‥ j - 1]. 0...n - 1
4 i ← j - 1 c4 n - 1
5 while i > 0 and A[i] > key c5
6 do A[i + 1] ← A[i] c6
7 i ← i - 1 c7
8 A[i + 1] ← key c8 n - 1
*/ void insert_sort(int array[], int left, int loop_times)
{//这块的插入排序感觉有点问题,第一个数字没有排啊
for (int j = left; j < left+loop_times; j++)
{
int key = array[j];
int i = j - 1; while (i > left && array[i] > key)
{
array[i+1] = array[i];
i--;
} array[i+1] = key;
}
} void insertion_sort(int array[],int first,int last)
{
int i,j;
int temp;
for(i = first + 1 ;i<=last;i++)
{
temp = array[i];
j=i-1;
//与已排序的数逐一比较,大于temp时,该数移后
while((j>=0)&&(array[j]>temp))
{
array[j+1]=array[j];
j--;
}
//存在大于temp的数
if(j!=i-1)
{array[j+1]=temp;}
} } int find_median(int array[], int left, int right)
{
if (left == right)
return array[left];int index;
for (index = left; index < right - 5; index += 5)
{
//insert_sort(array, index, 4);
insertion_sort(array,index,4);
int num = index - left;
midian_array[num / 5] = array[index + 2];
}
// 处理剩余元素
int remain_num = right - index + 1;
if (remain_num > 0)
{
//insert_sort(array, index, remain_num - 1);
insertion_sort(array,index,remain_num - 1);
int num = index - left;
midian_array[num / 5] = array[index + remain_num / 2];
}
int elem_aux_array = (right - left) / 5 - 1;
if ((right - left) % 5 != 0)
elem_aux_array++;
// 如果剩余一个元素返回,否则继续递归
if (elem_aux_array == 0)
return midian_array[0];
else
return find_median(midian_array, 0, elem_aux_array);
} // 寻找中位数的所在位置
int find_index(int array[], int left, int right, int median)
{
for (int i = left; i <= right; i++)
{
if (array[i] == median)
return i;
}
return -1;
} int q_select(int array[], int left, int right, int k)
{
// 寻找中位数的中位数
int median = find_median(array, left, right);
// 将中位数的中位数与最右元素交换
int index = find_index(array, left, right, median);
swap(array[index], array[right]);
int pivot = array[right];
// 申请两个移动指针并初始化
int i = left;
int j = right - 1;
// 根据枢纽元素的值对数组进行一次划分
while (true)
{
while(array[i] < pivot)
i++;
while(array[j] > pivot)
j--;
if (i < j)
swap(array[i], array[j]);
else
break;
}
swap(array[i], array[right]);
/* 对三种情况进行处理:(m = i - left + 1)
1、如果m=k,即返回的主元即为我们要找的第k 小的元素,那么直接返回主元a[i]即可;
2、如果m>k,那么接下来要到低区间A[0....m-1]中寻找,丢掉高区间;
3、如果m<k,那么接下来要到高区间A[m+1...n-1]中寻找,丢掉低区间。
*/
int m = i - left + 1;
if (m == k)
return array[i];
else if(m > k)
//上条语句相当于if( (i-left+1) >k),即if( (i-left) > k-1 ),于此就与2.2 节里的
//代码实现一、二相对应起来了。
return q_select(array, left, i - 1, k);
else
return q_select(array, i + 1, right, k - m);
} int _tmain(int argc, _TCHAR* argv[])
{
//srand(unsigned(time(NULL)));
//for (int j = 0; j < num_array; j++)
int a[4] = {13,26,9,100};
insert_sort(a,0,3); //insertion_sort(a,0,3); cout<<a[0]<<a[1]<<a[2]<<a[3]<<endl; //array[j] = rand();
int array[num_array]={0,45,78,55,47,4,1,2,7,8,96,36,45};
// 寻找第k 最小数
int k = 13;
int i = q_select(array, 0, num_array - 1, k);
cout << i << endl; getchar();
return 0;
}
【编程练习】快速select算法的实现的更多相关文章
- 快速select算法的实现
代码来自: http://blog.csdn.net/v_JULY_v 算法思想: // Quick_select.cpp : 定义控制台应用程序的入口点. // #include "std ...
- Bug2算法的实现(RobotBASIC环境中仿真)
移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不 ...
- SSE图像算法优化系列十三:超高速BoxBlur算法的实现和优化(Opencv的速度的五倍)
在SSE图像算法优化系列五:超高速指数模糊算法的实现和优化(10000*10000在100ms左右实现) 一文中,我曾经说过优化后的ExpBlur比BoxBlur还要快,那个时候我比较的BoxBlur ...
- 详细MATLAB 中BP神经网络算法的实现
MATLAB 中BP神经网络算法的实现 BP神经网络算法提供了一种普遍并且实用的方法从样例中学习值为实数.离散值或者向量的函数,这里就简单介绍一下如何用MATLAB编程实现该算法. 具体步骤 这里 ...
- C++基础代码--20余种数据结构和算法的实现
C++基础代码--20余种数据结构和算法的实现 过年了,闲来无事,翻阅起以前写的代码,无意间找到了大学时写的一套C++工具集,主要是关于数据结构和算法.以及语言层面的工具类.过去好几年了,现在几乎已经 ...
- Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。
Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得 ...
- 排序算法的实现之Javascript(常用)
排序算法的实现之Javascript 话不多说,直接代码. 1.冒泡排序 1.依次比较相邻的两个数,如果前一个比后一个大,则交换两者的位置,否则位置不变 2.按照第一步的方法重复操作前length-1 ...
- Alink漫谈(六) : TF-IDF算法的实现
Alink漫谈(六) : TF-IDF算法的实现 目录 Alink漫谈(六) : TF-IDF算法的实现 0x00 摘要 0x01 TF-IDF 1.1 原理 1.2 计算方法 0x02 Alink示 ...
- 万字长文,以代码的思想去详细讲解yolov3算法的实现原理和训练过程,Visdrone数据集实战训练
以代码的思想去详细讲解yolov3算法的实现原理和训练过程,并教使用visdrone2019数据集和自己制作数据集两种方式去训练自己的pytorch搭建的yolov3模型,吐血整理万字长文,纯属干货 ...
随机推荐
- tomcat启动批处理——setclasspath.bat
除了上面两个批处理,还有一个比较重要的脚本,即是setclasspath.bat,它主要负责寻找.检查JAVA_HOME和JRE_HOME两个变量. ************************* ...
- Spring Boot微服务架构入门
概述 还记得在10年毕业实习的时候,当时后台三大框架为主流的后台开发框架成软件行业的标杆,当时对于软件的认识也就是照猫画虎,对于为什么会有这么样的写法,以及这种框架的优势或劣势,是不清楚的,Sprin ...
- (一一三)使用系统自带框架操作SQLite3数据库
系统自带的框架是基于C语言的,使用比较繁琐. 下面是使用步骤: 首先导入libsqlite3.0.dylib. ①在Document目录下打开数据库,如果没有则创建. NSString *sqlite ...
- JUI/DWZ介绍、简单使用
简介 由于开发的项目使用JUI,所以学习了. DWZ富客户端框架(jQuery RIAframework), 是中国人自己开发的基于jQuery实现的Ajax RIA开源框架.(现在更名为JUI) 可 ...
- 【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705 参考博客 : [嵌入式开发]嵌入式 开发环境 (远 ...
- Ajax及jQuery学习
AJAX(Asynchronous JavaScript and XML),异步的javaScript与XML AJax中一个重要的对象是XMLHttpRequest. function ajaxSu ...
- Uva - 230 - Borrowers
AC代码: #include <iostream> #include <cstdio> #include <cstdlib> #include <cctype ...
- 多重DES
背景:单重DES在穷举攻击下相对比较脆弱 理论依据:以双重DES为例 加密:C = E(K2,E(K1,P)) 解密:P = D(K1,D(K2,C)) 要证明多重加密有效,就要证明不存在K3 ...
- 通用数据水平层级选择控件v0.70升级版使其支持jQuery v1.9.1
升级原因:作者原来脚本支持的jquery版本太低了,查找了下资料,使得它能支持最新版本的jquery 备注说明:脚本代码源作者跟源文出处很难找,只能在此特感谢他的分享. 更新部分: 1.新版本不再支持 ...
- 类装载器DexClassLoader (android内核剖析)
在java环境中,有个概念叫做"类装载器",其作用是动态装载Class文件.标准的java SDK中有一个ClassLoader类,借助它可以装载 想要的Class文件,每个Cla ...