排序
杜Xinyu
明明可以靠脸吃饭,却非要靠才华
展开
-
非比较排序——计数排序
计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。 [1] 当然这是一种牺牲空间换取时间的做法,而且当O(k)>O(nlog(n))的时候其效率反而不如基于比较的排序(基于比较的排序的时间复杂度在理论上的下限是O(nlog(n)), ...原创 2020-05-05 13:01:11 · 138 阅读 · 0 评论 -
C语言——归并排序(循环)
上一篇我们写到的是归并排序分治算法是用递归来实现的,但是其实我们自己观察可以写出一种不需要递归的方法,就是我们可以不需要分解的步骤,直接把序列当做已经分解好的序列来进行合并即可。代码实现:// 归并排序非递归实现 void MergeSortNonR(int* arr, int size){ int gap = 1; int* temp = (int*)malloc(size * s...原创 2020-05-05 11:49:32 · 368 阅读 · 0 评论 -
C语言——归并排序(分治)
归并排序该排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有 序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。图示:代码实现 // 归并排序递归实现 void MergeData(int* arr, int left, int m...原创 2020-05-05 10:49:45 · 714 阅读 · 0 评论 -
C语言——快速排序(前后指针法)
前后指针法思想就是俩个指针一前一后,然后从头开始遍历,当遇到比基准值小的值,俩个指针往后走一步,遇到比基准值大的就prev指针不动,cur往后走,当cur遇到比基准值小的就停下来, 然后cur指针每一次停止俩个指针之间的位置比较一下,如果俩个之间的差不是一的话,就交换俩个位置的数据,一直循环,知道遍历结束,用prev的后一个不是基准元素的位置的话,就,让prev和基准值进行交换。图示:代码...原创 2020-05-04 13:17:17 · 4115 阅读 · 0 评论 -
C语言——快速排序(挖坑法)
挖坑法原理图示:代码实现:// 挖坑法 int PartSort2(int* arr, int left, int right){ int end = right; int key; int mid = GetIndexMid(arr, left, right); if (mid != end) { int temp = arr[mid]; arr[mid] = a...原创 2020-05-03 13:17:49 · 513 阅读 · 0 评论 -
C语言——快速排序(hoare版本)
快速排序其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右 子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。具体的区间划分方式我这里总结了三种:hoare版本挖坑法前后指针法图示:代码实现://快速排序hoare版本 int PartSort1(int*...原创 2020-05-01 22:29:57 · 405 阅读 · 0 评论 -
冒泡排序以及优化
冒泡排序原理:就是遍历一次,然后将最大的数据给移动到序列尾部,这个遍历的过程是从头开始,一个个的比较前面的比后面的大,就交换位置,从后面的开始继续往后比较,一组遍历下来之后,最大的数据就移动到了尾部,然后控制下一次的遍历,遍历到倒数第二个元素的时候就不在往后比较了,当最后只有一个数据的时候就将数据按照升序排好了。原理图示:一次遍历走下来的整个过程和结果然后按照这样的遍历方式一直遍历下去,...原创 2020-04-28 15:47:26 · 181 阅读 · 0 评论 -
(直接)选择排序和堆排序
选择排序其思想是: 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。图示:代码实现:void swap(int* arr, int num1, int num2){ int temp = arr[num1]; arr[num1] = arr[num2]; arr[num2] = temp;}void SelectS...原创 2020-04-27 13:13:35 · 262 阅读 · 1 评论 -
插入排序和希尔排序
插入排序也叫直接插入排序是一种简单的插入排序法其基本思想就是:把待排序的记录按其关键码值的大小逐个插入到一 个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。整个排序的过程如下图:代码实现:void InsertSort(int* arr, int size){ int i = 1; for (; i < size; i++) { /*这种写法...原创 2020-04-26 17:19:52 · 189 阅读 · 0 评论 -
数据结构——排序
排序基本上可以分为四大类:插入排序、选择排序、交换排序、归并排序。从占用的空间来看还可以分为内部排序、和外部排序。当然,还有很特殊的排序的方法,比如计数排序、基数排序。所谓排序,就是讲一串有相同特征的数据,按照从小到大或者从大到小的顺序给排列。每一种排序都有自己的优点,不同的排序方法可能适用于不同的场景,衡量一个排序的好坏有以下几个数据来判断:时间复杂度、空间复杂度、稳定性。...原创 2020-04-26 13:32:43 · 171 阅读 · 0 评论