《算法导论》学习笔记之Chapter8线性时间排序

第8章 线性时间排序

前面介绍的包括归并排序,堆排序和快速排序,最后的次序都依赖于元素之间的比较,叫做比较排序

归并排序和堆排序都是渐近最优的,且任何已知的比较排序最多就是在常数因子上优于他们。即比较排序的时间复杂度下界就是Ω(nlogn)。

线性时间排序算法,包括:基数排序,计数排序和桶排序,是靠运算不是比较来排序的,下界Ω(nlogn)不是他们的下界。


计数排序:假设n个输入元素中的每一个都是在0-k区间内的一个整数,其中k为某个整数。当k=O(n)时,排序的运行时间为O(n)。基本思想是:对每一个输入元素x,确定小于x的元素个数。利用这一信息,直接把x放到他在输出数组中中的位置上了。当出现元素相同时,需要稍作修改。代码如下:

        //计数排序
	public void CountingSort(int[] a, int[] b, int k){
		int[] c = new int[k];
		for (int i = 0; i < k; i++){
			c[i] = 0;
		}
		//统计每个位置上的数字都分别有几个
		for (int j = 0; j < a.length; j++){
			c[a[j]] = c[a[j]] + 1;
		}
		//统计小于等于该排位上的数字的总数
		for(int i = 1; i < k; i++){
			c[i] = c[i] + c[i - 1];
		}
		//根据c上面每个排位的数字把a中的数字分别直接放到其排序后的数字上
		for (int j = a.length - 1; j >= 0; j--){
			b[c[a[j]] - 1] = a[j];
			c[a[j]] = c[a[j]] - 1;
		}
	}

计数排序的下界是Ω(nlogn),且是稳定的。具有相同值的元素在输出数组中的相对次序与输入数组中的相对次序相同。


基数排序:是一种用在卡片排序机上的算法。


桶排序:假设输入数据服从均匀分布,平均情况下他的时间代价为O(n)。与计数排序类似,桶排序也是对输入数据作出某种假设,所以速度较快。桶排序假设输入数据是由一个随机过程产生,该过程将元素均匀、独立地分布在[0,1)区间上。桶排序将[0,1)区间划分为n个相同大小的子区间,或称为桶。排序思想是:因为输入数据是均匀、独立地分布在[0,1)区间上,所以一般不会出现很多数落在同一个桶中的情况。为了的到输出结果,我们先对每个桶中的数进行排序,然后遍历每个桶,按照次序把各个桶的元素列出来即可。代码如下:

         public void BucketSort(Double[] a) {
		int n = a.length;

		/**
		 * 创建链表(桶)集合并初始化,集合中的链表用于存放相应的元素
		 */
		int bucketNum = 10; // 桶数
		LinkedList<LinkedList<Double>> buckets = new LinkedList<LinkedList<Double>>();
		for (int i = 0; i < bucketNum; i++) {
			LinkedList<Double> bucket = new LinkedList<Double>();
			buckets.add(bucket);
		}
		// 把元素放进相应的桶中
		for (int i = 0; i < n; i++) {
			int index = (int) (a[i] * bucketNum);
			buckets.get(index).add(a[i]);
		}
		// 对每个桶中的元素排序,并放进a中
		int index = 0;
		for (LinkedList<Double> linkedList : buckets) {
			int size = linkedList.size();
			if (size == 0) {
				continue;
			}

			// 把LinkedList<Double>转化为Double[]的原因是,之前已经实现了对数组进行排序的算法

			Double[] temp = new Double[size];
			for (int i = 0; i < temp.length; i++) {
				temp[i] = linkedList.get(i);
			}
			// 利用插入排序对temp排序
			InsertSort(temp);
			for (int i = 0; i < temp.length; i++) {
				a[index] = temp[i];
				index++;
			}
		}

	}

只要输入数据满足以下条件:所有桶的大小的平方和与总的元素数呈线性关系,那么桶排序就可以按照线性时间 θ(n)完成排序。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值