
算法
文章平均质量分 67
星语心愿的雨花石
每一只菜鸟,都有成为鹰的梦想!
展开
-
快速排序问题探讨
什么是快速排序?在一个无序的数组中选择一个基数,将数组中小于等于基数的元素放到基数左边,将大于等于基数的元素放到基数右边,不断循环此操作,完成排序。如何实现快速排序呢?指针法排序原理找到一个基数,左右设置两个指针,右指针找到小于等于基数的元素,左指针找到大于等于基数的元素,两个元素交换位置。循环上述流程,完成排序。下面是大神博客中指针法的核心代码:private static int partition(int[] arr, int startIndex, int endIndex) {//原创 2020-12-09 17:06:50 · 338 阅读 · 0 评论 -
直接选择排序
简介直接选择排序和插入排序类似,都是将数组分为有序部分和无序部分。不同点在于插入排序是将无序数组的第一位插入已排序数组中,插入位置可能是有序数组的前面、中间、后面,而插入排序是找出无序数组中的最小值插到有序数组末尾。实现获取最小元素下标找到数组中指定下标之后的最小元素下标,之所以要指定下标,是因为最小元素将会放到组数前端,不能再次参与最小元素的比较://找到数组中指定下标之后的最小元素下标 public static int getMim(int[] a, int index) {原创 2020-12-07 16:51:30 · 277 阅读 · 0 评论 -
堆排序
简介堆排序是将一个无序的数组看作一个完全二叉树,将完全二叉树构建成为一个大顶堆(或者小顶堆),构建完成后数组的第一个元素就是最大值(小顶堆是最小值),将第一个元素移动到数组最后位置,将剩余的数据看作一个新的数组,循环上面的操作,就可以完成排序。前提知识完全二叉树任意一个节点:R[i]其左子节点为:R[2i+1]其右子节点为:R[2i+2]其父节点为:R[(i-1)/2]最后一个非叶子节点为R[n/2-1],n为数组长度。构建大顶堆我认为堆排序的核心在于构建大顶堆(或小顶堆),构建完成之后就原创 2020-12-07 14:20:04 · 149 阅读 · 0 评论 -
希尔排序
排序思路插入排序在数据量小、基本有序的情况下效率比较高。那么数据量大,同时基本无序的情况呢?这种情况可以进行分组插入排序:根据特定步长将数组分为多个逻辑分组,对每个逻辑分组进行插入排序(每个逻辑分组数据量小,插入排序效率高),然后不断缩小步长,当步长为1时对整个数据进行一次插入排序。(基本有序,比直接使用插入排序效率高)排序实现参考大神思路希尔排序本质上是对插入排序的优化,可以在插入排序的基础上修改。或者把插入排序看成固定步长为1的希尔排序。要实现希尔排序,可以将插入排序的固定步长由1变为变量g原创 2020-12-03 18:05:53 · 148 阅读 · 0 评论 -
插入排序
排序思路将队列分为有序区和无序区两部分,每次从无序区选第一个元素插入到前面的有序区中的正确位置。插入前需要移动有序区元素。排序实现代码: //插入排序算法 public static int[] sort(int[] a) { //默认第一位为有序序列,从第二位开始判断 for (int i = 1; i < a.length; i++) { //拿到需要排序的值 int x = a[i];原创 2020-12-03 15:52:54 · 136 阅读 · 0 评论 -
C语言实现冒泡排序
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。冒泡排序算法的运作如下:比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除原创 2017-12-10 23:14:27 · 5378 阅读 · 0 评论