算法(60)-基本概念-栈-桶排(详解+代码)

文章介绍了栈作为先入后出的数据结构,以及线性表的特性。在C++中,STL(标准模板库)的栈实现可以在<stack>头文件中找到。此外,文章还详细讲解了计数排序和桶排序两种排序算法,包括其工作原理和Java代码实现。
摘要由CSDN通过智能技术生成

1.栈
 

 1、栈是一个先入后出的有序结构。

 2、栈是限制性表中元素的插入和删除只能在线性表的表尾进行的一种特殊线性表。

 3、允许插入和删除的一段称为变化端,叫栈顶(Top),另一端叫栈底(Bottom),在栈的最低端。

 4、压入元素在栈的最下端,称为压栈(Push),弹出元素从栈顶开始,称为弹栈(Pop)。

入栈:

 出栈:


线性表:仅在表尾进行插入或者删除的线性表。

STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。在C++标准中,STL被组织为下面的13个头文件:<algorithm >、<deque >、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。其中的<stack>就是栈。

stack<int> s;
for(int i=0;i<10;i++){
  s.push(i);
cout<<s.size()<<endl;
}
while (!s.empty()){
  s.pop();
}


2.计数排序


3.桶排

 

 实例+代码

    public static void radixSort(int[] arr) {
		if (arr == null || arr.length < 2) {
			return;
		}
		radixSort(arr, 0, arr.length - 1, maxbits(arr));
	}





    // 需要被排序的数组:arr[begin .. end]
	// 最大的数有几个十进制位:digit 10:2;100:3;1000:4
	// 辅助空间:bucket:有多少个数 就准备多少个辅助空间
    // 固定的个数:10 radix: 0~9
	// for循环:根据十进制位
	//        
        //1.取个位数做词频统计
	    //2.count->count' 《=0的有几个
	    //3.对于arr从右往左遍历数组  看个位数
	    //4.把数字考回原数组

	public static void radixSort(int[] arr, int begin, int end, int digit) {
		final int radix = 10;
		int i = 0, j = 0;

		int[] bucket = new int[end - begin + 1];
		for (int d = 1; d <= digit; d++) 
		{
			int[] count = new int[radix]; // 固定的数组 count[0..9]
            //1.取个位数出来做词频统计
			for (i = begin; i <= end; i++) 
			{
				j = getDigit(arr[i], d);   //取个位数
				count[j]++;
			}
            //2.count->count'
			for (i = 1; i < radix; i++) {
				count[i] = count[i] + count[i - 1];
			}

			//3.从右往左遍历数组
			for (i = end; i >= begin; i--) {
				j = getDigit(arr[i], d);
				bucket[count[j] - 1] = arr[i];
				count[j]--;
			}
			for (i = begin, j = 0; i <= end; i++, j++) {
				arr[i] = bucket[j];
			}
		}
	}


   //int x:被取数值
   //int d:取的位数
   //返回值:十进制数的特定位
	public static int getDigit(int x, int d) {
		return ((x / ((int) Math.pow(10, d - 1))) % 10);
	}

1.词频统计的结果:count[]

 2.count-count'结果 count'[]

3. 个位数从右往左遍历后的结果 :bucket[]

 


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值