【C++】【十二】排序实现及思路
掌握核心知识点:
1.插入排序在一下2种情况效率较高:1)数据基本有序 2)数据序列较少
希尔排序是在插入排序的基础上的改进。
2.快速排序
3.归并排序
4.堆排序:数据初始化为数据,根据完全二叉树,初始化并且调整堆的顺序
//冒泡排序
#include <iostream>
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
#include<sys/timeb.h>#define MAX 10long GetSysTime() {struct timeb tb;ftime(&tb);return tb.time * 1000 + tb.millitm;
}void Swap(int* a, int* b) {int temp = *a;*a = *b;*b = temp;
}void PrintArray(int arr[],int length) {for (int i = 0; i < length; ++i) {printf("%d ", arr[i]);}printf("\n");
}
//原始冒泡排序
void BubbleSort(int arr[], int length) {for (int i = 0; i < length; ++i) {for (int j = length-1; j > i; j--) {if (arr[j-1] < arr[j]) {//降序Swap(&arr[j-1],&arr[j]);}}}
}void BubbleSortImprovement(int arr[], int length) {int flag = 0;//表示 未排序for (int i = 0; i < length&&flag==0; ++i) {flag = 1;//认为未排序好for (int j = length - 1; j > i; j--) {if (arr[j - 1] < arr[j]) {//降序flag = 0;Swap(&arr[j - 1], &arr[j]);}}}
}
//选择排序
void SeleteSort(int arr[], int length) {for (int i = 0; i < length; ++i) {int min = i;for (int j = i+1; j < length; ++j) {if (arr[j] < arr[min]) {min = j;}}if (min != i) {Swap(&arr[i], &arr[min]);}}
}
//插入排序 1.将无序序列,插入到有序序列中 什么情况下,效果高:
//1)序列基本有序的情况下,插入效率高;
//2)插入排序时,元素序列比较少的情况下
void InsertSort(int arr[], int length) {int i, j, temp;for (i = 1; i < length;++i) {//升序if (arr[i] < arr[i - 1]) {temp = arr[i];for (j = i - 1; j >= 0 && temp < arr[j]; --j) {arr[j + 1] = arr[j];}arr[j + 1] = temp;}}
}
//分组插入排序
//对每一组分别进行插入排序
//increment=length increment=increment/3+1
void ShellSort(int arr[], int length) {//从小到大 rename 减少增量排序int increasement = length;do {int i, j, k;increasement = increasement / 3 + 1;for ( i = 0; i < increasement; ++i) { for (j = i + increasement; j < length; j+=increasement) {if (arr[j] < arr[j - increasement]) {int temp = arr[j];for (k = j - increasement; k >= 0 && temp < arr[k]; k -= increasement) {arr[k + increasement] = arr[k];}arr[k + increasement] = temp;}}}} while (increasement > 1);
}
//分治法(大问题分成小问题,解决小问题,从而解决大问题)+ 挖坑填数
void QuickSort(int arr[],int start,int end) {//从小到大int i = start;int j = end;int temp = arr[start];//基准数if (i < j) {while (i<j){//从右向左找比基准数小while (i < j && arr[j] >= temp) {j--;}if (i < j) { //填坑arr[i] = arr[j];i++;}//从左向右找比基准数大的数while (i < j && arr[i] < temp) {i++;} if (i < j) { //填坑arr[j] = arr[i];j--;}}//把基准数放到 i,j位置arr[i] = temp;//对基准数左半部分快速排序QuickSort(arr, start, i - 1);//右半部分QuickSort(arr, i + 1, end);}
}//归并排序:思想:将2个有序序列合并成一个有序序列int* CreatArray() {int* arr = (int*)malloc(sizeof(int)*MAX);srand((unsigned int)time(NULL));for (int i = 0; i < MAX; ++i) {arr[i] = rand() % MAX;}return arr;
}void Merge(int arr[],int start,int end,int mid,int* temp) {int i_start = start;int i_end = mid;int j_start = mid + 1;int j_end = end;int length = 0;//辅助空间元素//合并两个有序序列while (i_start <= i_end && j_start <= j_end){if (arr[i_start] < arr[j_start]) {temp[length] = arr[i_start];length++;i_start++;}else {temp[length] = arr[j_start];j_start++;length++;}} //i 序列while (i_start <= i_end) {temp[length] = arr[i_start];i_start++;length++;}while (j_start <= j_end) {temp[length] = arr[j_start];j_start++;length++;}//辅助空间数组,覆盖到原空间for (int i = 0; i < length; ++i) {arr[start + i] = temp[i];}
}
void MergeSort(int arr[], int start,int end,int* temp) {//从小到大if (start >= end) {return;}int mid = (start + end) / 2;//分组//左半边MergeSort(arr, start, mid, temp);//右半边MergeSort(arr, mid + 1, end, temp);Merge(arr, start, end, mid, temp);
}//堆排序 任意节点(非叶子节点):大顶堆从小大
// 给出一个数组 相当于给出一个完全二叉树 啊hi不满足堆的条件,通过调整堆
// 初始化堆,从下往上i=len/2,i--;
//待调整数组,待调整系欸但下表 待调整数组长度void myswap(int arr[], int a, int b) {int temp = arr[a];arr[a] = arr[b];arr[b] = temp;
}
void HeapAdjust(int arr[], int index, int len) {int max = index;int lchild = index * 2 + 1;int rchild = index * 2 + 2;if (lchild<len && arr[lchild]>arr[max]) {max = lchild;}if (rchild<len && arr[rchild]>arr[max]) {max = rchild;}if (max != index) {myswap(arr, max, index);HeapAdjust(arr, max, len);}}void HeapSort(int arr[], int length) {//初始化堆 for (int i = length / 2 - 1; i >= 0; i--) {HeapAdjust(arr, i, length);}//交换堆顶元素for (int i = length - 1; i >= 0; i--) {myswap(arr, 0, i);HeapAdjust(arr, 0, i);}
}int main(void)
{int arr[MAX];int arr2[MAX];srand((unsigned int)time(NULL));for (int i = 0; i < MAX; ++i) {arr[i] = rand() % MAX;arr2[i]= rand() % MAX;}//PrintArray(arr, MAX);//printf("-------insertt-------\n");//long t_start = GetSysTime();//InsertSort(arr, MAX);//long t_end = GetSysTime();//printf("%d,%d\n", MAX, t_end-t_start);//PrintArray(arr, MAX);//printf("---------shell------\n");//long t_shell_start = GetSysTime();//ShellSort(arr2, MAX);//long t_shell_end = GetSysTime();//printf("%d,%d\n", MAX, t_shell_end - t_shell_start);printf("-------quick--------\n");PrintArray(arr, MAX);//long t_quick_start = GetSysTime();//QuickSort(arr, 0, MAX - 1);//long t_quick_end = GetSysTime();//printf("%d,%d\n", MAX, t_quick_end - t_quick_start);PrintArray(arr, MAX);//printf("----merge----\n");PrintArray(arr, MAX);//long t_merge_start = GetSysTime();//int* temp = (int*)malloc(sizeof(int));//MergeSort(arr2, 0, MAX-1, temp);//long t_merge_end = GetSysTime();//printf("%d,%d\n", MAX, t_merge_end - t_merge_start);PrintArray(arr, MAX);//free(temp);printf("--------heap--------\n");HeapSort(arr, MAX);PrintArray(arr, MAX);printf("-------------------------\n");system("pause");return 0;
}
相关文章:

Centos 不小心删除了openssl,导致无法使用sshd、yum、wget、curl 等软件的问题。。...
2019独角兽企业重金招聘Python工程师标准>>> 1、如果安装了FTP,可以使用FTP上传rpm到服务器进行安装; 2、挂载光驱cdrom到mnt文件夹下,进入package文件夹rpm进行安装; 3、有源码包进行源码安装; 4、自求多福…

IplImage 类型和 CvMat 类型转换为 Mat 类型
IplImage *IplImg cvLoadImage("fruits.jpg"); Mat img(IplImg, true);转载:http://blog.csdn.net/zhuwei1988

麦当劳数字化转型中获得的6个数据科学经验
摘要 美国大数据公司Civis Analytics于2017年底与麦当劳北美市场营销和数据科学团队建立了数据技术合作伙伴关系,经过一年半的努力,近期在纽约广告周上共同展示了一些重要的学习成果。 麦当劳客户数据科学总监David Galinsky和麦当劳媒体科学经理Emma Hi…

操作系统(三)
学习记录(3) 线程 1.线程的优势在哪? 1.1 多线程之间会共享同一块地址空间和所有可用数据的能力,这是进程所不具备的。 1.2 线程要比进程更轻量级,由于线程更轻,所以它比进程更容易创建,也更容…

【Kubernetes】两篇文章 搞懂 K8s 的 fannel 网络原理
近期公司的flannel网络很不稳定,花时间研究了下并且保证云端自动部署的网络能够正常work。 1.网络拓扑 拓扑如下:(点开看大图) 容器网卡通过docker0桥接到flannel0网卡,而每个host对应的flannel0网段为 10.1.x.[1-255…

图像读取、转为灰度图像、均值平滑、显示保存操作
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> int main( ) {// 读取图像源cv::Mat srcImage cv::imread("..\\images\\pool.jpg");if( srcImage…

python 查询 elasticsearch 常用方法(Query DSL)
2019独角兽企业重金招聘Python工程师标准>>> 1. 建立连接 from elasticsearch import Elasticsearch es Elasticsearch(["localhost:9200"])2. 查询所有数据 # 方式1: es.search(index"index_name", doc_type"type_name"…

OpenCV 【十一】—— 图像去畸变,对极约束之undistort,initUndistortRectifyMap,undistort
目录 0.极限约束,对极校正 1.摄像机成像原理简述 2.成像畸变 2.1. 畸变数学模型 2.2. 公式推导 3.畸变校正 3.1. 理论推导 4. 图像去畸变** 5. 图像尺度缩放与内参的关系** 5.1 undistortPoints() 5.2 initUndistortRectifyMap() 5.3 undistort() 6.Un…

Ubuntu14.04 Mininet中将Openvswitch升级步骤
2019独角兽企业重金招聘Python工程师标准>>> 首先下载Mininet apt-get install mininetservice openvswitch-controller stopupdate-rc.d openvswitch-controller disablemn --test pingall 这里可能会出现以下错误sudo mn --mac --controllerremote,port6653 --top…

(转)软件测试的分类软件测试生命周期
软件测试的分类&软件测试生命周期 软件测试的分类: 按测试执行阶段:单元测试、集成测试、系统测试、验收测试、(正式验收测试,Alpha 测试-内侧,Beta 测试-公测) 按测试技术分类:黑盒测试、白…

OpenCV 【十二】OpenCV如何扫描图像、利用查找表和计时
目录 OpenCV如何扫描图像、利用查找表和计时 1.函数计算时间测试case 2. Mat图像的存储机理 3. 像素遍历的3--4种方式 4. 实例 OpenCV如何扫描图像、利用查找表和计时 如何计算函数运行时间? Mat图像如何存储? 如何高效遍历图像像素? …

Java String.split()用法小结
2019独角兽企业重金招聘Python工程师标准>>> 在java.lang包中有String.split()方法,返回是一个数组 我在应用中用到一些,给大家总结一下,仅供大家参考: 1、如果用“.”作为分隔的话,必须是如下写法,String.split("\\."),这样才能正确的分隔开,不能用Strin…

217. 验证码 demo
2019独角兽企业重金招聘Python工程师标准>>> 1.效果 2.准备: 下载相关的jar 这里我使用的是ValidateCode 这个jar https://my.oschina.net/springMVCAndspring/blog/1815719 (1)相关jar下载路径 链接:https://pan.…

OpenCV 【十三】矩阵的掩码操作
目录 1 Mask掩膜/滤波核 1.1 原理 1.2 实例 1.3 结果对比 2. filter2D函数 2.1 原理 2.2 实例 2.3 结果 1 Mask掩膜/滤波核 1.1 原理 矩阵的掩码操作很简单。其思想是:根据掩码矩阵(也称作核)重新计算图像中每个像素的值。掩码矩阵中…

【ArrayList】为什么java.util.concurrent 包里没有并发的ArrayList实现?
2019独角兽企业重金招聘Python工程师标准>>> 为什么java.util.concurrent 包里没有并发的ArrayList实现? 问:JDK 5在java.util.concurrent里引入了ConcurrentHashMap,在需要支持高并发的场景,我们可以使用它代替HashMa…

Android实现买卖商品小游戏
之前为了学习GreenDao,写的练手项目,欢迎指点 仿手游《混》《买房记》,单机游戏,无需联网 1、主界面 2、游戏界面 可以选择地区出发随机事件,进行贷款/还款,治疗,还债,买卖商品&…

OpenCV 【十四】改变图像的对比度和亮度高度关联章节:OpenCV 【十】——Gamma校正 ——图像灰度变化
目录 0 提问 1.1 原理 trick: 1.2 代码 1.3 结果 0 提问 访问像素值 用0初始化矩阵 saturate_cast 是做什么用的,以及它为什么有用 1.1 原理 图像处理 一般来说,图像处理算子是带有一幅或多幅输入图像、产生一幅输出图像的函数。 图像变换可分…

getRotationMatrix2D 函数
cv::Mat cv::getRotationMatrix2D( Point2f center, double angle, double scale ) {// 角度转换angle * CV_PI/180;// 计算旋转矩阵角度double alpha cos(angle)*scale;double beta sin(angle)*scale;Mat M(2, 3, CV_64F);double* m (double*)M.data;// 构建旋转矩阵m[0] …

java学习笔记-java中运算符号的优先顺序
java中各种运算符具有优先级顺序,一般会先计算优先级高的,再计算优先级低的。可以使用()使得优先级变为最高。在算术运算中,优先级为 --* / -在在逻辑运算中的优先级是 ! 取反&& || & |在位运算中的优先级 ÿ…

红帽发布第四季度和2019财年报告,多项指标维持两位数增速
近日,红帽公司发布了其第四季度和2019财年报告。这是在被 IBM以340亿美元的价格收购 后,红帽公布的第一份财报,数据颇为亮眼。 报告显示,红帽公司第四季度总收入8.79亿美元,同比增长14%;整个财年营收34亿美…

OpenCV 【十五】绘直线/椭圆/矩形/圆及其填充
目录 1. 概况 2. 原理 2.1 Point 2.2 Scalar 3. 代码 4.结果 1. 概况 如何用 Point 在图像中定义 2D 点 如何以及为何使用 Scalar 用OpenCV的函数 line 绘 直线 用OpenCV的函数 ellipse 绘 椭圆 用OpenCV的函数 rectangle 绘 矩形 用OpenCV的函数 circle 绘 圆 用Op…

spring-boot Junit4单元测试
2019独角兽企业重金招聘Python工程师标准>>> 如果是使用spring-boot 1.4以下的版本 RunWith(SpringJUnit4ClassRunner.class) SpringApplicationConfiguration(classes 启动类.class) public class ApplicationTest {//代码省略 } 使用SpringApplicationConfigurat…

VideoCapture 读取视频文件,显示视频(帧)信息
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> using namespace std; using namespace cv; int main() {// 定义相关VideoCapture对象VideoCapture capture;…

Go 1.12发布:改进了运行时性能以及模块支持
Go最新版本1.12于近日发布,该版本并没有改动语法规范,它主要对运行时性能、编译工具链以及模块系统等进行了优化。另外,它还为TLS 1.3提供了opt-in支持,同时改进了对MacOS和iOS等系统的支持。 Go 1.12最大的更新亮点是改进了Go运行…

OpenCV 【十六】RNG随机数发生器putText绘制文字
1 目的 使用 随机数发生器类 (RNG) 并得到均匀分布的随机数。 通过使用函数 putText 显示文字。 第一步是实例化一个 Random Number Generator(随机数发生器对象) (RNG): RNG rng( 0xFFFFFFFF ); 初始化一个 0 矩阵(代表一个全黑的图像), 并且指定它…

分享一段Java搞笑的代码注释
原文:http://www.cnblogs.com/xdp-gacl/p/4198935.html // _ooOoo_ // o8888888o // 88" . "88 // (| -_- |) // …

视频写操作,通道分离与合并
#include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> using namespace std; using namespace cv; int main() { // 视频读入与输出路径设置 string sourceVideoPath "..\\images\\test.avi"; st…

JAVA中的并发工具 -- CountDownLatch、CyclicBarrier、Semaphore
2019独角兽企业重金招聘Python工程师标准>>> CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作。 CountDownLatch的构造函数接受一个int类型的参数作为计数器,如果你想等待N个点完成,这里就传入N。 当我们调用CountDownL…

OpenCV 【十七】离散傅立叶变换
目录 1 key 2 原理 3 实例 3代码 4运行结果 5应用举例 1 key 什么是傅立叶变换及其应用? 如何使用OpenCV提供的傅立叶变换? 相关函数的使用,如: copyMakeBorder(), merge(), dft(), getOptimalDFTSize(), log() 和 normalize() . 简单点说就是…

ubuntu下nginx+php5的部署
ubuntu下nginxphp5环境的部署和centos系统下的部署稍有不同,废话不多说,以下为操作记录:1)nginx安装rootubuntutest01-KVM:~# sudo apt-get update && sudo apt-get upgraderootubuntutest01-KVM:~# sudo apt-get install…