在前面复习了三个简单排序Java数据结构和算法(三)--三大排序--冒泡.选择.插入排序,属于算法的基础,但是效率是偏低的,所以现在 学习高级排序 插入排序存在的问题: 插入排序在逻辑把数据分为两部分,左边:数据是有序的,右边:数据是无序的 上图中的元素2,是最小的数据,但是在最右边,我们需要和之前的元素进行比较,然后每个元素都要后移,直到找到应该插入的位置,这里 对于元素2来说,所有的元素都要后移一位 这个过程将近存在N次复制,移位的次数平均N/2,所以执行效率是O(N^2) 所以如果能以某种…
三大排序在我们刚开始学习编程的时候就接触过,也是刚开始工作笔试会遇到的,后续也会学习希尔.快速排序,这里顺便复习一下 冒泡排序: 步骤: 1.从首位开始,比较首位和右边的索引 2.如果当前位置比右边的大,则交换位置 3.当前位置的索引向右移动一位,必须两两比较 图例: 代码实现: public static int[] sort(int[] array) { for (int i = 1; i < array.length; i++) { //外层循环,代表着需要经过多少轮比较 boolean…
高级排序比简单排序要快的多,简单排序的时间复杂度是O(N^2),希尔(shell)排序大约是O(N*(logN)^2),而快速排序是O(N*logN). 说明:下面以int数组的从小到大排序为例. 希尔(shell)排序 希尔排序是基于插入排序的,首先回顾一下插入排序,假设插入是从左向右执行的,待插入元素的左边是有序的,且假如待插入元素比左边的都小,就需要挪动左边的所有元素,如下图所示: ==> 图1和图2:插入右边的temp柱需要outer标记位左边的五个柱子都向右挪动 如图3所示,相比插入排…
一.堆的定义 堆通常是一个可以被看做一棵树的数组对象,其任一非叶节点满足以下性质: 1)堆中某个节点的值总是不大于或不小于其父节点的值: 每个节点的值都大于或等于其左右子节点的值,称为大顶堆.即:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]. 或: 每个节点的值都小于或等于其左右子节点的值,称为小顶堆.即:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]. 2)堆总是一棵完全…
一.基本思想 希尔排序算法是希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.   二.算法过程 1)取增量,一般取数组长度 / 2: 2)按增量取得子序列,对子序列进行插入排序: 3)将增量递减,重复1.2步骤: 4)直至增量均为0,数列已经排好序.   三.…
排序需要掌握的有冒泡排序,插入排序和选择排序.时间为O(N*N). 冒泡排序: 外层循环从后往前,内存循环从前往后到外层循环,相邻数组项两两比较,将较大的值后移. 插入排序: 从排序过程的中间开始(程序从第二个数组项开始a[1]),此时队列已经拍好了一部分.此时,将后边的数组项一次插入到已经排好序的部分队列中. 选择排序: 从第一个数组项开始,找到包括该数组项在内的所有往后数组项中的最小项与当前项进行交换,其实相当于依次将最小值往前冒泡. 示例代码: package chap03.BubbleS…
排序中的两种基本操作是比较和交换.在插入排序中还有移动. 冒泡排序:两两比较相邻元素,如果较大数位于较小数前面,则交换: 每一趟遍历将一个最大的数移到序列末尾,共遍历N-1趟. 如果执行完一趟之后没有进行元素的交换,那么该序列已经有序. public void bubbleSort(){ int out,in; for(out=array.length-1;out>0;out--){ for(in=0;in<out;in++){ if(arrry[in]>array[in+1]){ sw…
比较排序与非比较排序的对比 常见的快速排序.归并排序.堆排序.冒泡排序等属于比较排序.在排序的最终结果里,元素之间的次序依赖于它们之间的比较.每个数都必须和其他数进行比较,才能确定自己的位置.在冒泡排序之类的排序中,问题规模为n,又因为需要比较n次,所以平均时间复杂度为O(n²).在归并排序.快速排序之类的排序中,问题规模通过分治法消减为logN次,所以时间复杂度平均O(nlogn).比较排序的优势是,适用于各种规模的数据,也不在乎数据的分布,都能进行排序.可以说,比较排序适用于一切需要排序的情…
简单排序 选择排序 概念 首先,找到数组中最小的那个元素,其次,把它和数组的第一个元素交换位置(如果第一个元素就是最小的元素那么它就和自己交换).再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置.如此往复,直到将整个数组排序.这种方法叫做选择排序,因为它在不断地选择剩余元素中地最小者. 代码实现 public static void SelectionSort(int[] arr){ if(arr==null||arr.length<2) return; //去除多余情况 in…
1.冒泡排序(BubbleSort) 介绍:重复的遍历数列,一次比较两个元素,如果他们顺序错误就进行交换. 2016年1月22日总结: 冒泡排序就是比较相邻的两个元素,保证每次遍历最后的元素最大. 排序过程需要用到:int i,j; def bubble_sort(arry): n = len(arry) #获得数组的长度 for i in range(n): for j in range(1,n-i): if arry[j-1] > arry[j] : #如果前者比后者大 arry[j-1],…