数据结构
企鹅也渴望飞翔
这个作者很懒,什么都没留下…
展开
-
交换排序之快速排序
快速排序是对冒泡排序的一种改进。其基本思想是基于分治法的:在待排序表L[1…n]中任取一个元素pivot作为基准,通过一趟排序将待排序表划分为独立的两部分L[1…k-1]和L[k+1…n],使得L[1…k-1]中所有元素小于pivot,L[k+1…n]中所有元素大于或等于pivot,则pivot放在了其最终位置L[k]上,这个过程称作一趟快速排序。而后分别递归地对两个子表重复上述过程,直至每部分内只原创 2016-03-28 13:12:18 · 716 阅读 · 0 评论 -
交换排序之冒泡排序
冒泡排序算法的基本思想是:假设待排序表长为n,从前往后(或从后往前)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i]),则交换它们,直到序列比较完。我们成它为一趟冒泡,结果将最大(最小)的元素交换到待排序列的最后一个位置。下一趟冒泡时,前一趟确定的最大元素不再参与比较,待排序列减少一个元素,每趟冒泡的结果把序列中的最大元素放到了序列的最终位置。原创 2016-03-28 12:25:39 · 662 阅读 · 0 评论 -
归并排序
“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。假定待排序表含有n个记录,则可以看成是n歌有序的子表,每个子表长度为1,然后两两归并,得到⌈n/2⌉个长度为2或1的有序表,再两两归并,… … 如此重复,直到合并成一个长度为n的有序表为止,这种排序方法称为2-路归并排序。如下图的例子: public class MergeSort {public static void main(St原创 2016-03-28 15:55:11 · 472 阅读 · 0 评论 -
基数排序
基数排序是一种很特别的排序算法,它不是基于比较进行排序的,而是采用多关键字排序思想,借助“分配”和“收集”两种操作对单逻辑关键字进行排序。 基数排序利用了数字只有0,1,…,9这10个数字的特点, 排序步骤如下: 给定一组数字,如{ 278, 109, 63, 930, 589, 184, 505, 269, 8, 83 } (1)判断数据在个位数的大小,排列数据; (2)根据(1)的结果,原创 2016-03-28 16:47:21 · 498 阅读 · 0 评论 -
插入排序
插入排序的基本思想在于每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中,直到全部记录插入完成。插入排序可以引申出三个排序算法:直接插入排序,折半插入排序,希尔排序。这里先介绍直接插入排序。 假设在排序过程中,带排序表L[1…n]在某次排序过程中的某一时刻状态如下: { 有序列表L[1…i-1] | L(i) | 无序列表L[i+1…n] } 为了将元素L(i)插原创 2016-03-28 15:39:56 · 444 阅读 · 0 评论 -
选择排序
选择排序的基本思想是:假设排序表为L[1…n],每一趟(例如第i趟)即从L[i…n]中选择关键字最小的元素与L(i)交换,每一趟排序可以确定一个元素的最终位置。这样经过n-1趟排序就可以使得整个排序表有序。public class SelectSort { public static void main(String[] args) { int[] values = { 120原创 2016-03-28 18:42:28 · 332 阅读 · 0 评论 -
堆排序
1、堆的定义 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2]。在最大堆中,最大元素放在根节点中,且对任一非根节点,它的值小于或等于其双亲节点值。最小对则相反,根节点是最小元素。2、堆排序的思想 利用最大堆(最小堆)堆顶记录的是最大关键字(最小原创 2016-04-18 11:02:04 · 2144 阅读 · 0 评论 -
10亿数据中取最大的100个数据
思路1:根据快速排序划分的思想 (1)递归对所有数据分成[a,b)b(b,d]两个区间,(b,d]区间内的数都是大于[a,b)区间内的数 (2)对(b,d]重复(1)操作,直到最右边的区间个数小于100个。注意[a,b)区间不用划分 (3)返回上一个区间,并返回此区间的数字数目。接着方法仍然是对上一区间的左边进行划分,分为[a2,b2)b2(b2,d2]两个区间,取(b2,d2]区间。如果原创 2016-04-18 22:11:22 · 5649 阅读 · 1 评论