
排序算法
Karate_Y
先努力让自己发光,对的人才能迎着光而来
展开
-
实现原地堆排序(CPP)
堆是一种非常有用的数据结构,我们可以利用大顶堆或者小顶堆这种数据结构完成堆排序,但是这样会增加O(n)的辅助空间,其实,真正的堆排序是可以在原地进行的,我们称之为原地堆排序,今天我们就来实现一下原地堆排序吧。原地堆排序主要分两个步骤:1. 对数组进行堆化2. 将最大元素与数组末端元素交换,然后对前n-1个元素继续堆化。具体代码为:#include <iostream&g...原创 2019-10-24 11:08:55 · 358 阅读 · 0 评论 -
C 实现快速排序(第四版)--三路快速排序
#include <iostream>#include <ctime>#include <algorithm>using namespace std;// 递归的三路快速排序算法template <typename T>void __quickSort3Ways(T arr[], int l, int r){ if( l &...原创 2019-10-22 10:46:43 · 258 阅读 · 0 评论 -
C++ 实现快速排序(第三版)--双路快速排序
针对待排序数组中可能存在于相同元素过多问题,可以对partition函数以另一种方式书写,我们将其称为双路快速排序。代码如下:#include <iostream>#include <algorithm>#include <ctime>using namespace std;template <typename T>int ...原创 2019-10-22 10:13:37 · 254 阅读 · 0 评论 -
C 实现快速排序(第二版)--针对原始数组接近有序的优化
我们在前面的章节中知道,当原始未排序的数据接近有序时,使用直接插入排序可以将时间复杂度退化到O(n)级别,那么就像归并排序中的优化一样,我们在快速排序中,当子数组的元素小于15时,我们采用直接插入排序。因为元素个数越少,数据越接近有序。,而且我们在基准值的设定上,不是采用数组第一个元素,而是采用区间内随机元素。优化过后的代码如下:/** * 快速排序优化 * 针对接近有序的数组,直接插入...原创 2019-10-21 18:59:20 · 345 阅读 · 0 评论 -
C++ 实现快速排序(第一版)
快速排序作为20世纪最伟大的算法之一,将排序的时间复杂度降到了O(nlgn),主要使用了分而治之的思想,归并排序也使用了分而治之的思想。快速排序的主要思想是找到一个基准值,将比基准值小的元素放置在基准值左边,比基准值大的元素放置在基准值右边。其最重要的函数实现部分是partition函数,该函数不仅在快速排序中发挥了重要作用,在其他算法中也有使用,另一个最常见的使用场景是TopK问题.。下...原创 2019-10-21 17:03:43 · 171 阅读 · 0 评论 -
C++ 实现归并排序(迭代)
在上一篇博客中,我简单介绍了归并排序,并用递归版本实现了归并排序,这篇博客主要给出归并排序的迭代版本。直接上代码:#include <iostream>using namespace std;template<typename T>void __merge(T arr[], int l, int mid, int r){ T aux[r-l...原创 2019-10-17 15:26:35 · 583 阅读 · 0 评论 -
C++ 实现归并排序(递归)
今天学习第一个时间复杂度为O(nlogn)的排序算法------归并排序。首先给出定义:“归并”一词的中文含义就是合并,并入的意思,而在数据结构中的定义是将两个或者两个以上的有序数组组合成一个新的有序表。归并排序(MergingSort)原理:假设初始序列含n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后晾凉归并,得到[n/2]([x]表示不小于x的最小整数)个长度......原创 2019-10-17 14:40:51 · 957 阅读 · 0 评论 -
C++ 实现希尔排序
希尔排序是直接插入排序的改进形式。为此,这里首先贴出直接插入排序的代码,方便作为对比。直接插入排序#include <iostream>#include <algorithm>using namespace std;// 直接插入排序template <typename T>void insertSort(T arr[], int n){...原创 2019-10-16 22:04:33 · 148 阅读 · 0 评论 -
C++ 实现冒泡排序
定义冒泡排序(Bubble Sort)是一种交换排序, 它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。简单交换排序首先来看一种最简单的交换排序算法。严格意义上来说,它不算是标准的冒泡排序算法,因为它不满足“两两比较相邻记录”的冒泡排序思想。#include <iostream>#include <algorithm>...原创 2019-10-16 19:07:52 · 237 阅读 · 0 评论 -
C++ 实现直接插入排序
直接插入排序引言直接插入排序在生活中最好的体现就是玩扑克牌,我们理牌的方式是把3和4移动到5的左侧,再拿到一张2,把2移到最左侧,拿到一张10,放最后边,再拿到一张7,插入5与10中间。这里我们的理牌方法就是直接插入排序。话不多说,直接上代码,这里一步步给出不同的写法:写法1#include <iostream>#include <algorithm>...原创 2019-10-16 15:20:39 · 450 阅读 · 0 评论 -
C++ 实现简单选择排序
简单选择排序算法简单选择排序法就是通过n-i关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i( 1<=i<=n)个记录交换之。话不多说,直接上代码:#include <iostream>#include <algorithm>using namespace std;template<typename T>v...原创 2019-10-16 14:23:10 · 229 阅读 · 0 评论