阅读《啊哈,算法》笔记

阅读《啊哈,算法》第一章

简单桶排序

输入一组数据并对其进行排序,假设数据是5,3,5,2,8,简单的桶排序是另外创建一个数组,来记录输入数组的每个数出现的次数,最后按照自己新创建的数组对每个数字出现几次,打印几次就行了,如图:


奉上代码:

		int[] arrs = new int[6];
		Scanner reader = new Scanner(System.in);
		System.out.println("请输入数组:");
		for(int i = 0 ; i < arrs.length ; i++) {
			arrs[i] = reader.nextInt();
		}
		int[] books = new int[10];
		for(int i = 0 ; i < arrs.length ; i++) {
			books[arrs[i]] += 1; 
		}
		for(int i = 0 ; i < books.length ; i++) {
				for(int j = 0 ; j < books[i] ; j++) {
					System.out.print(i + "\t");
			}
		}

输入:

5 3 5 2 8 2

输出:

2 2 3 5 5 8

注:这个简单桶排序,很浪费空间,如果需要排序的数组中有2000000这个数字,就需要创建一个2000001的长度数组,而且这不是真正的桶排序,但是现在还没学到,以后再说吧

冒泡排序

每次对相邻的两个数字进行比较,如果不是想要的顺序就将他们进行对换
如图:
在这里插入图片描述
这只是其中的一次的过程,后面的自行了解
奉上代码:

for(int i = 0 ; i < arrs.length - 1 ; i++) {
			for(int j = 1 ; j < arrs.length - i ; j++) {
				if(arrs[j -1] > arrs[j]) {//出现顺序不对,交换
					int t = arrs[j - 1];
					arrs[j - 1] = arrs[j];
					arrs[j] = t;
				}
			}

输入:

5 3 5 2 8 2

输出:

2 2 3 5 5 8

快速排序

输入一组数组,先找一个基数(一般是数组的第一个),然后比如将大于基数的数放在左边,小于基数的数放在右边,然后进行循环操作,就能进行排序
如图:
在这里插入图片描述
这是一组进行的,后续的就重复进行即可
奉上代码:

private static void kuaiSu(int left,int right) {
		//需要先进行判断左右两边否是正确的数值,不然的话,后面的基数可能会出错
		if(left > right)
			return;
		int temp = arrs[left];//基数
		int i = left;int j = right;
		while(i != j) {
			//先从右边开始(确保最后左边和右边的(left,right)到同一个位置的时候是能满足要求的)
			//在这个例子里面,是把大于基数的放在左边,小于基数的放在右边,如果先从左边开始的话就会有可能两个指针相遇的地方是
			//左指针停下的地方,然后再进行交换的时候就会出现把小于基数的数换到了左边了
			while(arrs[j] <= temp && i < j) {
				j--;
			}
			while(arrs[i] >= temp && i < j) {
				i++;
			}
			if(i < j) {
				int t = arrs[i];
				arrs[i] = arrs[j];
				arrs[j] = t;
			}
		}
		arrs[left] = arrs[i];
		arrs[i] = temp;
		kuaiSu(0,i - 1);
		kuaiSu(i + 1,right);
	}

输入:

5 3 5 2 8 2

输出:

8 5 5 3 2 2

这些暂时就是我所学的一些内容,现在属于初学,不足之处,希望指正,万分感谢
内容中的图片均来自于《啊哈,算法》一书中,强推。如有冒犯,我就删了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值