1.5.7 排序
1.5.7 排序
vimer-hz
书是越读越薄的
展开
-
9 计数排序
计数排序是一个类似于桶排序的排序算法,其优势是对已知数量范围的数组进行排序。它创建一个长度为这个数据范围的数组C,C中每个元素记录要排序数组中对应记录的出现次数。非原址排序。(1)思路:计数排序算法的基本思想是对于给定的输入序列中的每一个元素x,确定该序列中值小于x的元素的个数。一旦有了这个信息,就可以将x直接存放到最终的输出序列的正确位置上。例如,如果输入序列中只有17个元素的值小...原创 2019-12-18 22:36:21 · 93 阅读 · 2 评论 -
8 桶排序
非比较排序: 比较排序是基于输入元素间的比较。任意一个比较排序算法在最坏情况下需要比较的次数至少为nlogn。所以说快速排序,堆排序,归并排序都是渐进最优的排序算法。他们的最坏情况时间复杂度为O(nlogn)。 非比较排序不是基于元素间比较的。包括:桶排序,基数排序,计数排序。桶排序:属于非原址排序。(1)思路:假定:输入是由一...原创 2019-12-18 22:07:57 · 141 阅读 · 2 评论 -
7 归并排序
归并排序是采用分治法的一个典型应用。属于非原址排序。(1)思路:归并排序是将两个有序表合并成一个新的有序表。即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。(2)复杂度分析:(2.1)时间复杂度:对长度为n的文件,需进行logn趟归并,每趟归并的时间为O(n),故其时间复杂度是O(nlogn)。(2.2)空间复...原创 2019-12-18 17:59:25 · 263 阅读 · 2 评论 -
6 堆排序
堆排序是利用堆的性质进行的一种树形选择排序。属于原址排序。(1)堆的性质:堆有两个性质,分别为结构性质和堆序性质。结构性质:堆是一颗完全二叉树。堆序性质(大顶堆):对任意节点x,x中的键值大于等于左子树节点或右子树节点中的键值。(2)思路: 1)将初始待排序关键字序列(R1,R2....Rn)构建成大顶堆,此时堆顶元素R[1]为最大元素。 2...原创 2019-12-18 12:13:47 · 155 阅读 · 2 评论 -
5 选择排序
(1)思路: 对待排序的序列,选出关键字最小的数据,将它和第一个位置的数据交换,接着,选出关键字次小的数据,将它与第二个位置上的数据交换。以此类推,直到完成整个过程。所以如果有n个数据,那个需要遍历n-1遍。(2)复杂度分析:(2.1)时间复杂度: 总的比较次数为(n-1)+(n-2)+…+1=1/2*n*(n-1):O()...原创 2019-12-18 11:17:37 · 118 阅读 · 2 评论 -
4 快速排序
快速排序是一种分治的递归算法,从本质上来说,它是归并排序的就地版本。属于原址排序。(1)思路: 把待排列的数据分为两个子列,从数列中挑出一个数作为“基准”,然后遍历其他数据并和“基准”比较,把小于它的放前面,大于它的放后面。之后通过递归,将各个子序列划分为更小的序列,直到把小于基准值元素的子数列和大于基准值元素的子数列都排序好。(2)复杂度分析:(2.1...原创 2019-12-18 11:01:38 · 99 阅读 · 2 评论 -
3 冒泡排序
属于原址排序。(1)思路: 冒泡排序就是把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。每次遍历完原数组一次,最大的元素便在最后面。(2)复杂度分析:(2.1)时间复杂度: 最好情况: 正序有序,只需要比较n次。所以为O(n)。程序需加个flag标志位,一次遍历若是正序则break。 最坏情...原创 2019-12-18 10:27:59 · 113 阅读 · 1 评论 -
2 希尔排序
是对插入排序的改进,也叫作缩减增量排序。属于原址排序。(1)思路: 先取一个小于n(数组长度)的整数d1作为第一个增量,把文件的全部记录分成(n/d1)个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-1<…<d2<d1), 即...原创 2019-12-18 10:08:42 · 173 阅读 · 1 评论 -
1 插入排序
插入排序适用于少量元素排序。属于原址排序。(1)思路:每次选择一个元素A[i]插入到之前已排好序(从小到大)的部分A[1…i-1]中,插入过程中A[i]依次由后向前与A[1…i-1]中的元素进行比较。若发现A[i]>=A[x],则将A[i]插入到A[x]的后面,A[i]插入前需要移动元素。(2)复杂度分析:(2.1)时间复杂度: 最好情况:正序...原创 2019-12-17 23:07:02 · 107 阅读 · 1 评论