随笔分类 - 排序算法
摘要:一、优先队列(堆)优先队列包括两种操作的数据结构,插入和删除最小者。二叉堆的结逻辑结构是一个完全填满的二叉树,有可能的例外是在底层,底层上的元素从左到右排列。二叉堆的物理结构是一个数组,元素存放从下标为1的位置开始。因为这样子实现的话,对于数组中的某一个位置i的元素,在下标不越界的情况下(也就是说该节点有孩子的情况下),其左孩子在位置2i上,有孩子在2i+1上。二、插入操作对于堆的插入操作实现,一般使用的策略是上滤(percolate up)策略。上滤操作是只先将要插入的元素插入到最后位置,然后与其父节点比较,如果比父节点还要小,说明该节点放在该位置不符合堆序性质(堆序性质是指一个父节点的值小
阅读全文
摘要:算法描述:快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分(本例中由partition函数实现),其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。Java源代码:package ljp.sort.quick;public class QuickSortDemo01 { private int[] list; // 构造函数,初始化数组 public QuickSortDemo01() { list = new int[10.
阅读全文
摘要:算法描述:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。Java源代码:package l
阅读全文
摘要:算法描述:归并(Merge)排序是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。对一个数组进行归并排序主要分为以下三步:1、分解。将一个数组分为两个个数组。2.、治之。对分好的两个数组,分别用归并排序算法进行排序。3、归并。将两个数组归并。Java源代码:package ljp.sort.merge;public class MergeSortDemo01 { private int[] list; //构造函数,初始化数组 public MergeSortDemo01() { list = new .
阅读全文
摘要:算法描述:在上一篇插入排序算法中,已经提到,插入排序的核心是在有序的集合中找到要插入的位置。所以,在这里介绍一种对插入排序的改进算法,即折半插入排序。折半插入排序是指利用折半查找的算法,在有序集合中找到要插入的位置。Java代码:package ljp.sort.insert;public class InsertSortDemo02 { private int[] list; public InsertSortDemo02(int[] list) { this.list = list; } // 将i位置的元素插入到j位置 public void insert(int i, int j) .
阅读全文
摘要:算法描述:从一个无序的集合中取出一个元素,插入到一个有序的集合的合适位置,有序的集合插入新元素之后,仍然是有序的。所以该算法最核心的部分是要在有序集合中找到合适的插入位置。Java代码:package ljp.sort.insert;public class InsertSortDemo01 { private int[] list; public InsertSortDemo01(int[] list){ this.list = list; } public void sort(){ int count = 0;//排序次数 for(int i = 1;i<list.length;i+
阅读全文
浙公网安备 33010602011771号