数据结构与算法——排序

文章目录

    • 1.冒泡排序
    • 2.选择排序
    • 3.插入排序
    • 4.快速排序
    • 5.堆排序
    • 6.归并排序
    • 7.希尔排序

1.冒泡排序

将一个数组从小到大排序,一次循环(从头开始遍历,将相邻的两个数值比较,如果前面一个大于后面的数字,交换这两个数字)可以将循环数组中的最大值放在最后面,经过多次冒泡就可以完成排序

平均时间复杂度O(n2)O(n^2)O(n2)
最坏时间复杂度O(n2)O(n^2)O(n2)
最好时间复杂度O(n)O(n)O(n)
空间复杂度O(1)
#include<iostream>
#include<vector>using namespace std;//1.冒泡算法
void bubblesort(vector<int>& array,int N) {for (int i = 0; i < N; i++) {for (int j = 0; j < N - 1 - i; j++) {if (array[j] > array[j + 1]) {swap(array[j], array[j + 1]);}}}
}

2.选择排序

一次循环,找出最大值,与最后一个值做交换,执行多次循环

#include<iostream>
#include<vector>
using namespace std;//2.选择排序
void selectsort(vector<int>& array, int N) {for (int i = 0; i < N; i++) {int max = array[0];int location = 0;for (int j = 0; j < N - i; j++) {if (array[j] > max) {max = array[j];location = j;}}swap(array[location], array[N - 1 - i]);}
}
int main() {vector<int> array = { 2,1,5,6,0,1,2,8,10,3,8 };selectsort(array, array.size());for (int i = 0; i < array.size(); i++) {cout << array[i] << " ";}cout << endl;
}

3.插入排序

假设数组i位置前面的(0~i-1)个元素,是有序数组(从小到大),在前面的有序数组中插入第i个元素,从后向前,依次和第i个元素比较,大的向后,直到插入合适位置,循环N-1次就可以完成排序。

#include<iostream>
#include<iostream>
#include<vector>
using namespace std;//3.插入排序
void insertsort(vector<int>& array,int N) {for (int i = 1; i < N; i++) {int n = i;while (n>0&&array[n] < array[n-1]) {swap(array[n], array[n - 1]);n--;}}
}
int main() {vector<int> array = { 2,1,5,6,0,1,2,8,10,3,8 };insertsort(array, array.size());for (int i = 0; i < array.size(); i++) {cout << array[i] << " ";}cout << endl;
}

参考链接:插入排序

4.快速排序

选定数组中一个数pivot作为中心轴
将大于pivot的数放在pivot的右边,将小于pivot的数放在pivot的左边
分别对左右子序列重复第一步第二步的操作

平均时间复杂度O(nlog2n)O(nlog_2 n)O(nlog2n)
最坏时间复杂度O(n2)O(n^2)O(n2)
最好时间复杂度O(nlog2n)O(nlog_2 n)O(nlog2n)
空间复杂度O(nlog2n)O(nlog_2 n)O(nlog2n)
#include<iostream>
#include<vector>
using namespace std;void quicksort(vector<int>& array, int left,int right) {if (left >= right) {return;}int l = left;int r = right;while (l < r) {while (array[left] <= array[r] && l < r) {r--;}while (array[left] >= array[l] && l < r) {l++;}swap(array[l], array[r]);}swap(array[left], array[l]);quicksort(array, left, l - 1);quicksort(array, l + 1, right);
}
int main() {vector<int> array = { 2,1,5,6,0,1,2,8,10,3,8 };quicksort(array, 0, array.size() - 1);for (int i = 0; i < array.size(); i++) {cout << array[i] << " ";}cout << endl;
}

参考链接:快速排序

5.堆排序

构造一个大顶堆/小顶堆,取堆顶数字,也就是最大值/最小值
再将剩下的数字构建一个大顶堆/小顶堆,,取堆顶数字
重复以上的操作,直到取完堆中的数字,得到一个从大到小/从小到大的有序数组

#include<iostream>
#include<iostream>
#include<vector>using namespace std;//5.堆排序
void HeapSort(vector<int>& result, int count, int location) {if (location<0 || location>count) {return;}int left_location = 2 * location + 1;int right_locaton = 2 * location + 2;int max = result[location];if (left_location < count && max < result[left_location]) {max = result[left_location];}if (right_locaton < count && max < result[right_locaton]) {max = result[right_locaton];}if (max != result[location]) {if (left_location < count && max == result[left_location]) {result[left_location] = result[location];HeapSort(result, left_location, count);}else if (right_locaton < count && max == result[right_locaton]) {result[right_locaton] = result[location];HeapSort(result, right_locaton, count);}result[location] = max;}
}
vector<int> heap_sort(int array[], int N) {vector<int> result;for (int i = 0; i < N; i++) {result.push_back(array[i]);}for (int count = N; count > 0; count--) {for (int location = count / 2; location >= 0; location--) {HeapSort(result, count, location);}int value = result[0];result[0] = result[count - 1];result[count - 1] = value;}return result;
}
int main()
{int array[] = { 2,6,1,5,0,8,4,3 };int N = sizeof(array)/4;vector<int> sorted;//sorted= bubble_sort(array, N);//sorted = select_sort(array, N);//sorted = insertion_sort(array, N);//sorted = quick_sort(array, N);sorted = heap_sort(array, N);for (int i = 0; i < sorted.size(); i++) {cout << sorted[i] << " ";}cout << endl;return 0;}

参考链接:
堆排序算法
排序算法
图解排序算法(三)之堆排序

6.归并排序

将数组中的数分为若干组,开始各组数字都是单个元素
两两排序归并,保证归并后的数组是有序的
重复上面两步,直到合成一个组

平均时间复杂度O(nlog2n)O(nlog_2 n)O(nlog2n)
最坏时间复杂度O(nlog2n)O(nlog_2 n)O(nlog2n)
最好时间复杂度O(nlog2n)O(nlog_2 n)O(nlog2n)
空间复杂度O(n)O(n)O(n)
#include<iostream>
#include<vector>using namespace std;//6.归并排序
void mergesort(vector<int>& array, int left, int right) {if (left >= right) {return;}int mid = (left + right) / 2;mergesort(array, left, mid);mergesort(array, mid + 1, right);int l = left;int r = mid + 1;vector<int> tmp;while (l <= mid && r <= right) {if (array[l] > array[r]) {tmp.push_back(array[r]);r++;}else {tmp.push_back(array[l]);l++;}}while (l <= mid) {tmp.push_back(array[l]);l++;}while (r <= right) {tmp.push_back(array[r]);r++;}for (int i = 0; i <= right - left; i++) {array[i + left] = tmp[i];}
}int main() {vector<int> array = { 2,1,5,6,0,1,2,8,10,3,8 };//quicksort(array, 0, array.size() - 1);//bubblesort(array, array.size());mergesort(array, 0, array.size() - 1);for (int i = 0; i < array.size(); i++) {cout << array[i] << " ";}cout << endl;
}

参考链接:

归并排序算法讲解
十分钟学会写归并排序

7.希尔排序

该方法的基本思想是:
先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,
然后依次缩减增量再进行排序,
待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。

因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。

#include<iostream>
#include<iostream>
#include<vector>using namespace std;//7.希尔排序
void shell_swap(int a, int b, vector<int>& result) {int temp = result[a];result[a] = result[b];result[b] = temp;
}
vector<int> shell_sort(int array[], int N) {vector<int> result;for (int i = 0; i < N; i++) {result.push_back(array[i]);}for (int gap = N / 2; gap > 0; gap--) {for (int i = gap; i < N; i++) {for (int j = i - gap; j >= 0 && result[j] > result[j + gap]; j -= gap) {shell_swap(j, j + gap, result);}}}return result;
}int main()
{int array[] = { 2,6,1,5,0,8,4,3,10 };int N = sizeof(array)/4;vector<int> sorted;//sorted= bubble_sort(array, N);//sorted = select_sort(array, N);//sorted = insertion_sort(array, N);//sorted = quick_sort(array, N);//sorted = heap_sort(array, N);//sorted = merge_sort(array, N);sorted = shell_sort(array, N);for (int i = 0; i < sorted.size(); i++) {cout << sorted[i] << " ";}cout << endl;return 0;}

参考链接:

[算法]六分钟彻底弄懂希尔排序,简单易懂
白话经典算法系列之三 希尔排序的实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/483033.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Luogu P4168 [Violet]蒲公英 分块

这道题算是好好写了。写了三种方法。 有一个好像是$qwq$$N\sqrt(N)$的方法&#xff0c;&#xff0c;但是恳请大佬们帮我看看为什么这么慢$qwq$&#xff08;后面的第三种&#xff09; 注:$pos[i]$表示$i$属于第$pos[i]$块。 第一种是统计所有可能的块组成的区间中&#xff08;第…

一文掌握明年物联网传感器市场!2022中国AIoT产业全景图谱报告新鲜出炉

来源&#xff1a;传感器专家网物联网产业是传感器应用最广泛的领域之一&#xff0c;研发新型传感器&#xff0c;做传感器市场&#xff0c;都不能不考虑物联网产业的需求。2021年随着COVID-19 病毒的存在已常态化&#xff0c;防疫抗疫进入了拉锯阶段&#xff1b;波及全球的“芯片…

spring学习笔记06-spring整合junit(出现的问题,解决的思路)

spring学习笔记06-spring整合junit&#xff08;出现的问题&#xff0c;解决的思路&#xff09; 文章目录spring学习笔记06-spring整合junit&#xff08;出现的问题&#xff0c;解决的思路&#xff09;3.1测试类中的问题和解决思路3.1.1 问题3.2.1 第一步&#xff1a;pom.xml文件…

phpstorm 不能自动打开上次的历史文件

问题产生的原因&#xff1a;可能是电脑非正常关机&#xff0c;导致phpstrom 无法正常关闭。 一开始我以为是配置上那里出现了问题&#xff0c;所以直接就把配置删除了&#xff0c;然后生成了默认配置。发现还是无法解决问题。然后一个个配置查阅过去。因为我的ide是英文&#x…

EUV光刻机内部揭秘!

转载自: ittbank来源&#xff1a;半导体行业观察PatrickWhelan正在透过他的洁净室服面板凝视着事情的进展。在他面前是一块闪闪发光的玻璃&#xff0c;大约有一个烤箱那么大&#xff0c;上面刻有许多挖出的部分以减轻重量&#xff0c;看起来像一个外星图腾。Whelan 的团队正在将…

数据结构与算法——搜索

文章目录1.内容概述2.岛屿数量2.1 题目描述2.2 DFS深度搜索算法思路2.3 BFS宽度搜索算法思路2.4 C代码实现3.单词接龙3.1 题目描述3.2 算法思路3.3 C代码实现4.单词接龙 II4.1 题目描述4.2 算法思路5.火柴拼正方形5.1 题目描述5.2 算法思路5.3 代码实现5.4 算法思路25.5 代码实…

mybatis学习笔记-01什么是mybatis

该视频为狂神说java视频配套笔记&#xff08;博主自己手打223&#xff0c;日后做个参考223&#xff09;&#xff0c;b站连接&#xff1a;Mybatis最新完整教程IDEA版【通俗易懂】-01-什么是mybatis 文章目录1.简介1.1是什么1.2持久层1.3持久层1.4为什么需要mybatis&#xff1f;1…

小程序基础能力~网络

&#xff08;1&#xff09;网络-使用说明 网络 在小程序/小游戏中使用网络相关的 API 时&#xff0c;需要注意下列问题&#xff0c;请开发者提前了解。 1. 服务器域名配置 每个微信小程序需要事先设置通讯域名&#xff0c;小程序只可以跟指定的域名与进行网络通信。包括普通 HT…

mybatis学习笔记-02-第一个mybatis程序

该视频为狂神说java视频配套笔记&#xff08;博主自己手打223&#xff0c;日后做个参考223&#xff09;&#xff0c;b站连接&#xff1a;Mybatis最新完整教程IDEA版【通俗易懂】-02-第一个mybatis程序) 文章目录2.第一个mybatis程序2.1搭建环境2.2 创建一个模块2.3编写代码2.4测…

徐波所长专访 | 人工智能:从“作坊式”走向“工业化”新时代

来源&#xff1a;人民网人工智能创新不断 “一体两翼”快速发展人民网&#xff1a;当前&#xff0c;人工智能技术创新不断&#xff0c;应用层出不穷。它究竟走到了哪一步&#xff1f;能否谈谈您是如何看待我国人工智能技术发展现状的&#xff1f;徐波&#xff1a;人工智能是一个…

linux——线程(1)

文章目录1.线程概念1.1 什么是线程1.2 线程和进程区别1.3 线程实现原理1.4 三级映射1.5 线程共享资源1.6 线程非共享资源1.7 线程优、缺点2.线程控制原语2.1 pthread_self 函数2.2 pthread_create 函数3.线程与共享3.1 线程共享全局变量4.线程退出4.1 pthread_exit 函数1.线程概…

mybatis学习笔记-03-CRUD操作

该视频为狂神说java视频配套笔记&#xff08;博主自己手打223&#xff0c;日后做个参考223&#xff09;&#xff0c;b站连接&#xff1a;Mybatis最新完整教程IDEA版【通俗易懂】-03-CRUD操作) 3.CRUD 1.namespace ​ namespace中的包名要和 Dao/mapper 接口的包名一致 2.se…

Redis压缩列表原理与应用分析

摘要 Redis是一款著名的key-value内存数据库软件&#xff0c;同时也是一款卓越的数据结构服务软件。它支持字符串、列表、哈希表、集合、有序集合五种数据结构类型&#xff0c;同时每种数据结构类型针对不同的应用场景又支持不同的编码方式。这篇文章主要介绍压缩列表编码&…

Science公布2021年度十大科学突破,AI这项前所未有的突破上榜

来源&#xff1a; 学术头条撰文&#xff1a;朱哼哼编审&#xff1a;王哈哈排版&#xff1a;李雪薇2021 年 11 月 17 日&#xff0c;Science 杂志公布了 2021 年的年度科学突破榜单&#xff0c;AlphaFold 和 RoseTTA-fold 两种基于人工智能预测蛋白质结构的技术位列榜首。除此之…

linux——线程(2)

文章目录1.pthread_join 函数2.pthread_detach 函数3.pthread_cancel 函数4.终止线程方式5.控制原语对比6.线程属性7.线程属性初始化8.线程的分离状态9.线程使用注意事项1.pthread_join 函数 阻塞等待线程退出&#xff0c;获取线程退出状态 其作用&#xff0c;对应进程中 waitp…

mybatis学习笔记-04-常见错误排查

4.错误排查 1.标签问题 mapper.xml中的namespace&#xff0c;中间是用小圆点隔开的 resource绑定 mapper&#xff0c;需要使用路径!&#xff08;使用/隔开&#xff09; 3.程序配置文件必须符合要求 4.NullPointerException &#xff1a;没有注册到资源 5.输出的xml文件中…

linux——线程通信(1)

文章目录1.同步概念2.线程同步3.数据混乱原因&#xff1a;4.互斥量 mutex5.mutex 主要应用函数&#xff1a;5.1 pthread_mutex_init 函数5.2 pthread_mutex_destroy 函数5.3 pthread_mutex_lock 函数5.4 pthread_mutex_unlock 函数5.5 pthread_mutex_trylock 函数5.6 加锁与解锁…

OpenAI教GPT-3学会上网,「全知全能」的AI模型上线了

来源&#xff1a;机器学习研究组订阅它被命名为 WebGPT&#xff0c;OpenAI 认为浏览网页的方式提高了 AI 解答问题的准确性。如果 AI 学会上网&#xff0c;那么它就拥有了无限获取知识的方式&#xff0c;之后会发生什么就不太好预测了。于是著名 AI 研究机构 OpenAI 教那个开启…

201671030111 李蓉 实验十四 团队项目评审课程学习总结

项目内容这个作业属于哪个课程软件工程这个作业的要求在哪里实验十四 团队项目评审&课程学习总结作业学习目标掌握软件项目评审会流程&#xff0c;反思总结课程学习内容。任务一&#xff1a;结合本学期课程学习内容&#xff0c;对比《实验一 软件工程准备》的任务5你所提的…

linux——线程通信(2)

文章目录1.条件变量1.1 条件变量函数&#xff1a;1.2 pthread_cond_init 函数1.3 pthread_cond_destroy 函数1.4 pthread_cond_wait 函数1.5 pthread_cond_timedwait 函数1.6 pthread_cond_signal 函数1.7 pthread_cond_broadcast 函数2.生产者消费者模型3.条件变量的优点&…