随笔分类 - 算法分析
摘要:分析总结定义:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。快速排序、希尔排序、堆排序、直接选择排序不是稳定的排序算法,而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj, Ai原来在位置前,排序后Ai还是要在Aj位置前。其次,说
阅读全文
摘要:堆排序堆定义n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质):(1)ki=号。//k(i)相当于二叉树的非叶结点,K(2i)则是左孩子,k(2i+1)是右孩子若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。【例】关键字序列(10,15,56,25,30,70)和(70,56,30,25,15,10)分别满足堆性质(1)和(2),故它们均是堆,其对应的完全二叉树分别如小根堆示例和大根堆示例所示。大根堆和小根堆:根结点
阅读全文
摘要:归并排序package basic.sort;import java.util.Arrays;import java.util.Random;public class MergeSort { private > void mergeSort(AnyType[] arr){ AnyType[] arrNew = (AnyType[]) new Comparable[arr.length]; mergeSort(arr , arrNew , 0 , arr.length-1); } private > void mergeS...
阅读全文
摘要:基数排序package basic.sort;import java.util.Arrays;import java.util.Random;public class RadixSort { /** * use LSD * @param number * @param d key code number in fact is the radix; */ private void radixSort(int[] number, int d) { int k = 0; int n = 1; int m = 1;...
阅读全文
摘要:shell排序是对插入排序的一种改进。package basic.sort;import java.util.Arrays;import java.util.Random;public class ShellSort { public static > void shellSortOnce(AnyType a[]){ AnyType temp; if((a==null)||(a.length==0)){ return ; } for(int gap = a.length /2 ; gap > 0 ...
阅读全文
摘要:简单的快速排序算法,我竟然花费了如此多的时间来写作,好好学习。 1 /** 2 * 3 */ 4 package basic.sort; 5 6 import java.util.Arrays; 7 import java.util.Random; 8 9 public class QuickSort {10 11 12 public static >13 void quickSort(AnyType[] arr){14 if(arr == null || arr.length ==0){15 return ;16 ...
阅读全文
摘要:选择排序与冒泡排序有很大的相同点,都是一次遍历结束后能确定一个元素的最终位置,其主要思路是,一次遍历选取最小的元素与第一个元素交换,从而使得一个个元素有序,而后选择第二小的元素与第二个元素交换,知道,最后只剩下一个元素,起就是最大的元素,此时排序完成。代码如下;eclipse 4.3 jdk1.6 1 package basic.sort; 2 3 import java.util.Arrays; 4 import java.util.Random; 5 6 public class SelectSort { 7 8 9 public static >10 ...
阅读全文
摘要:插入排序过程:在初始状态下,第一个元素是排序的,在最终状态下,作为一组数据时排序的。代码如下;eclipse4.3实现package sort.basic;import java.util.Arrays;public class insertSort { private static Integer[] nums={34,78,90,45,3432,343,43,545,464,57,23,1323}; public static > AnyType[] insertSortOnce(AnyType[] num){ AnyType[] arr =...
阅读全文
摘要:冒泡排序是原理最简单的一种排序算法,具体思想就不多说了,代码如下:eclipse4.3中编译通过 1 package sort.basic; 2 3 import java.util.Arrays; 4 5 public class bubbleSort { 6 7 private static int[] nums={34,78,90,45,3432,343,43,545,464,57,23,1323}; 8 9 public static int[] bubbleSortOnce(){10 int[] num = nums;11 ...
阅读全文
摘要:设A[1..n]是一个包含N个非负整数的数组。如果在i〈 j的情况下,有A〉A[j],则(i,j)就称为A中的一个逆序对。 例如,数组(3,1,4,5,2)的“逆序对”有<3,1>,<3,2><4,2><5,2>,共4个。 那么该如何求出给定一个数列包含逆序对个数? 首先最简单的方法,直接遍历,时间复杂度为O(n^2) 源码如下: 1: //最简单的办法...
阅读全文
摘要:时间复杂度,平均O(nlogn),最坏O(n); 不稳定的算法 1、算法思想 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。 (1) 分治法的基本思想 分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将...
阅读全文
摘要:交换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。 应用交换排序基本思想的主要排序方法有:冒泡排序和快速排序。 时间复杂度O(n^2), 空间复杂度O(1) 稳定的排序算法 1、排序方法 将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则...
阅读全文
摘要:注:所讲述链表不带单独的头结点、 删除结点其实是一个很简单的问题,其关键在索要善删除的结点是第一个结点是,头结点位的解决。 若是头结点需要单独进行操作,其源码如下: 1: int del_node(linka** head, int elem) { 2: if(head ==NULL || *head ==NULL) 3: ...
阅读全文
摘要:注明,本博客均假设链表没有单独的头结点。 网上博客:http://blog.csdn.net/niuer09/article/details/5961004 一种有有单独头结点的一种实现,带有头结点的实现起来要简单一些的。 单向链表的逆序或是反转是经常会遇到的一个面试题,也是一个非常基础的问题,我自己的面试中就已经遇到的两次。 比如一个链表是这样的: 1->2->3->4->5 通过反转后...
阅读全文

浙公网安备 33010602011771号