排序算法
文章平均质量分 60
ali48
望诸君不吝赐教!!!
展开
-
快速排序(Quick Sort)
算法介绍顾名思义,快速排序(Quick Sort)是实践中的一种快速的排序算法,排序效率在同为O(NlogN)的几种排序算法中较高,在C++或对Java基本类型的排序中特别有用。快速排序其实是在冒泡排序的基础上做出的一个改进,和归并排序一样,快速排序也是一种利用分治思想的递归算法。算法描述实现快速排序包含三个最重要的步骤:一、选取枢纽元(从数列中选取的一个基准数)二、分割过程:将比枢纽元小的数全放到它的左边,大于或等于它的数全放到它的右边。三、递归处理左右子序列,直到每个数都处在正确位置。动原创 2021-05-29 17:22:17 · 911 阅读 · 0 评论 -
归并排序(Merge Sort)
算法介绍归并排序(Merge Sort)是利用归并的思想实现的一种稳定的排序方法,该算法采用经典的分治(divide-and-conquer)策略,分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案合并在一起,即分而治之。算法描述一、分(Divide):将N个元素分成两个含N/2个元素的子序列。二、治(Conquer):用合并排序法对两个子序列递归的排序。三、合(Combine):合并两个已排序的子序列以得到排序结果。动图演示性能原创 2021-05-22 18:57:05 · 445 阅读 · 0 评论 -
希尔排序(Shell Sort)
算法介绍希尔排序(ShellSort)的名字源于它的发明者Donald Shell,是直接插入排序算法的一种更高效的改进版本,它是一种插入排序算法,希尔排序也叫作缩减增量排序。算法描述希尔排序通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小,直到比较距离减小为1,即比较相邻元素的最后一趟排序为止。动图演示性能分析代码实现...原创 2021-05-22 16:30:39 · 329 阅读 · 0 评论 -
堆排序(Heap Sort)
算法介绍 顾名思义,堆排序就是利用堆(Heap)这种数据结构进行排序,在堆排序算法中,我们使用的是最大堆(大根堆),堆排序是一种选择排序。算法描述 第一步:利用build_max_heap函数将输入数据构建大根堆。 第二步:因为大根堆中的最大元素总是在根节点,通过把它与堆的最后一个元素交换,就可以把该元素放在正确的位置(从此可以看出堆排序是一种选择排序)。 第三步:从堆中去掉最后一个元素,剩余结点中,原来根的孩子结点仍然是大根堆,而新的根结点可能会违背最大堆性质,因此,我们需要调用max_原创 2021-05-15 15:54:45 · 332 阅读 · 0 评论 -
树形选择排序(锦标赛排序)
算法介绍 树形选择排序(Tree Selection Sort),又称锦标赛排序(Tournament Sort),是一种按锦标赛的思想进行选择排序的方法。简单选择排序花费的时间主要在比较上,每次都会进行很多重复的比较,造成浪费时间。锦标赛排序就是通过记录比较结果,减少比较次数,从而降低时间复杂度。算法描述 首先对n个记录的关键字进行两两比较,然后再对胜者进行两两比较,如此重复,直至选出最小关键字的记录为止。这个过程可用一棵有n个叶子结点的完全二叉树描述。图片演示用锦标赛排序对下图序列排序。原创 2021-05-15 15:47:47 · 4116 阅读 · 2 评论 -
2-路插入排序(Two-Way Insertion Sort)
算法介绍 2-路插入排序是在折半插入排序的基础上改进的,插入排序的时间主要花在比较和移动这两种操作上。2-路插入排序可以减少排序过程中移动记录的次数,但为此需要借助n个记录的辅助空间。算法描述 利用一个与排序序列一样大小的数组作为辅助空间,设置first和final指针标记辅助数组开始位置和最后位置。遍历未排序序列,如果待插入元素比已排序序列最小的元素(first位置)小,则first位置前移,将待排序元素插入first位置;如果待插入元素比已排序序列最大的元素(final位置)大,则final位原创 2021-05-15 14:57:43 · 2291 阅读 · 0 评论 -
折半插入排序(Binary Insertion Sort)
算法描述 直接插入排序在有序序列中查找时采用顺序查找,既然是有序序列,自然可以想到采用二分查找减少查找次数。时间复杂度还是 O(N^2),因为不管是采用二分查找还是顺序查找,算法大部分时间都花在元素的移动上,二分查找只能减少比较次数,在查找位置上节约时间。性能分析 时间复杂度:O(N^2) 空间复杂度:O(1) 稳定性:稳定代码实现void binaryInsertionSort(int array[], int length) { for (int i = 1; i <原创 2021-05-15 14:46:57 · 227 阅读 · 0 评论 -
冒泡排序(Bubble Sort)
介绍 冒泡排序是一种最基础的交换排序(两两比较待排序的关键字,交换不满足次序要求的那对数,直到整个表都满足次序要求为止),工作方式如同碳酸饮料中的二氧化碳气泡最终会上浮到顶端一样,故名"冒泡排序"。算法描述 一次比较相邻的数据,将小数据放在前(假设非递减排列),大数据放在后。即第一趟比较第1个和第2个数,小数在前,大数在后,再比较第2个数与第3个数,小数在前,大数在后,以此类推比较第n - 1个和第n个数,小数在前,大数在后;第一趟后最大元素已放在正确位置,以此类推,直到全部元素放在正确的位置。原创 2021-05-15 14:24:20 · 250 阅读 · 0 评论 -
直接插入排序(Straight Insertion Sort)
介绍 直接插人排序的工作方式像许多人排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。如图2-1所示,拿在左手上的牌总是排序好的,原来这些牌是桌子上牌堆中顶部的牌。对于少量元素的排序,插入排序是一个有效的算法。算法描述 首先我们将数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元素,就是数组的第一个元素,然后在未排序区间中依次取出元素原创 2021-05-15 14:11:14 · 233 阅读 · 0 评论 -
简单选择排序(Simple Selection Sort)
介绍 简单选择排序的工作方式突出"选择"二字,每次从待排序数据中选择符合条件的元素放在已排序元素末尾。对于少量元素的排序,简单选择排序是一个有效的算法。算法描述 第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。动图演示性能分析 时间复杂度:O(N^2) 空间复杂度:O(1) 稳定性:不稳定代码实现void selectionS原创 2021-05-15 14:02:08 · 401 阅读 · 0 评论