掌握核心知识点:

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;
}

【C++】【十二】排序实现及思路相关推荐

  1. linux按照学号对文件进行排序,学号20175313 《实现Linux下Sort -t : -k 2功能》第十二周...

    一.题目要求 实现Linux下Sort -t : -k 2的功能 二.题目理解 -t 分隔符,将每一行数据按照该选项指定的分隔符分成多个域.默认情况下是使用tab键或者空格符来分割的. -k 指定用哪 ...

  2. 经典算法题每日演练——第二十二题 奇偶排序

    原文:经典算法题每日演练--第二十二题 奇偶排序 这个专题因为各种原因好久没有继续下去了,MM吧...你懂的,嘿嘿,不过还得继续写下去,好长时间不写,有些东西有点生疏了, 这篇就从简单一点的一个&qu ...

  3. BUUCTF Misc杂项前十二道题的思路和感悟

    title: BUUCTF Misc date: 2021年8月18日 17点27分 tags: MISC categories: MISC 1.BUUCTF 签到题 直接告诉了flag. 2.BUU ...

  4. 2021年大数据Hive(十二):Hive综合案例!!!

    全网最详细的大数据Hive文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 Hive综合案例 一.需求描述 二.项目表的字段 三.进 ...

  5. .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现...

    本篇我将带着大家一起来对Dapper进行下封装并实现基本的增删改查.分页操作的同步异步方法的实现(已实现MSSQL,MySql,PgSQL).同时我们再实现一下仓储层的代码生成器,这样的话,我们只需要 ...

  6. 《c++ templates》学习笔记(9)——第十二章 特化与重载

    1       第十二章 特化与重载 1.1    重载函数模板 和一般的函数重载类似,函数模板也可以进行重载,比如下面的两个f,这是两个同名函数,1和2并没有关系,2不是1的局部特化.2是1的一个重 ...

  7. CQOI2019(十二省联考)游记

    CQOI2019(十二省联考)游记 Day -? 自从联赛爆炸,\(THUWC\)爆炸,\(WC\)爆炸(就没有不爆炸的)之后我已经无所畏惧... 听说是考\(4.5 h\)吗? Day -1 \(Z ...

  8. java 轻量级同步volatile关键字简介与可见性有序性与synchronized区别 多线程中篇(十二)...

    概念 JMM规范解决了线程安全的问题,主要三个方面:原子性.可见性.有序性,借助于synchronized关键字体现,可以有效地保障线程安全(前提是你正确运用) 之前说过,这三个特性并不一定需要全部同 ...

  9. 【Java数据结构与算法】第十二章 哈夫曼树和哈夫曼编码

    第十二章 哈夫曼树和哈夫曼编码 文章目录 第十二章 哈夫曼树和哈夫曼编码 一.哈夫曼树 1.基本术语 2.构建思路 3.代码实现 三.哈夫曼编码 1.引入 2.介绍 3.代码实现哈夫曼编码综合案例 一 ...

  10. 【互动媒体】”十二个一“的文艺创作的文本分析与可视化

    互动媒体的大作业之一.似乎一整个学期都在和这十二个一打交道,尝试了看待一个简单书法作品的多种维度,也发掘了诸如拟人化.拟物化等在内的多种其他视角.然而,不到期末我们就永远不知道这些数据最后将会去向哪里 ...

最新文章

  1. 关闭页面不用提示的方法
  2. Linux-鸟菜-5-文件权限
  3. jvm六:主动使用(1.new一个对象, 2.反射)
  4. 无线网络渗透测试-使用Wifite破解无线网络
  5. jsonschema中的$ref的循环引用导致json-editor栈溢出
  6. Eclipse快捷键以及设置
  7. 大端小端模式判断以及数据转换
  8. 19.删除链表的倒数第N个节点
  9. HTML示例07---图像与超链接
  10. jenkins + Git 搭建持续集成环境
  11. 循环buffer的实现_Go并发编程-Channel的设计实现
  12. 用Proxy进行预处理
  13. 380.常数时间插入、删除和获取随机元素
  14. 浅谈Tarjan算法
  15. 五个优秀的视频格式转换工具
  16. 手机与电脑视频呼java_Android手机播放电脑视频文件-屌丝必备
  17. cmak(kafka Manager) 编译教程
  18. 两种无密码解锁iPhone锁屏密码的方法
  19. modbus RTU 与OPC-UA、OPC-DA、MQTT协议区别对比
  20. linux 移除用户所在的组,Linux用户及用户组添加和删除操作

热门文章

  1. 谷歌json插件_程序员必备的4款Chrome插件,妥妥的神器!
  2. 换了路由器电脑都连不上网了_技术丨电脑连不上网,我要如何冲浪?
  3. github javaguide_GitHub上收获Star数排名前10的Java项目
  4. Python Qt GUI设计:QPrinter打印图片类(基础篇—21)
  5. LabVIEW图像分割算法(基础篇—6)
  6. 【radar】毫米波雷达动态障碍物检测相关论文汇总(聚类、分类、稀疏2D点、4D点、雷达成像、原始数据处理)(4)
  7. 心跳实现_真强啊!建议每一位Java程序员都读读Dubbo心跳设计的源码...
  8. xk3190串口通讯JAVA开发包_常用品牌plc通讯协议汇总学习
  9. mysql低权限用户getshell_GetShell的姿势总结
  10. ❤比较两种模糊特效❤filter: blur(10px)和backdrop-filter: blur(10px)的区别