我的伟大航路(10)

今天学习比较少

今天的内容有
1、两个排序方法
(关于排序方法,我觉得对于理解算法比较重要故学之)
(1)、冒泡排序
(2)、快速排序
2、一个算法题(今天不是只做了一个题,是因为别的题是入门的那种,非常简单,没有讲头)

1、冒泡排序

冒泡排序,即两两对比,前者大的与后者互换
两层循环
一层为假设最坏的情况下的循环次数(假设有5个数字,每个数字都需要互换,除了第一个自己本身以外,所以这层循环的上限是5-1)
另一层为最坏情况下还剩下多少互换的循环次数(假设5个数字,第一个数字还可能互换5-1次,最后一个数字还可能互换0次,所以这层循环的上限是5-1-x)(x是最外层循环当下的循环数)

简单来说就是外层循环是选择第几个数字去比较
内层循环是这个数字需要去比较的其他数字

代码比较简单,所以直接上完整的

public static void bubbleSort(int[] arr) {
		int a;//用作两数交互的中间数
		for (int i = 0; i < arr.length - 1; i++) {//最外层循环
			for (int j = 0; j < arr.length - 1 - i; j++) {//内层循环
				if (arr[j] > arr[j + 1]) {//如果当下的数字比它下一个数字大
					a = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = a;//这三句完成交换数据
				}
			}
		}
	}

結果

这是原始数组数据[3, 7, 2, 9, 4, 1, 0, 5, 8]
这是冒泡排序后的数组数据[0, 1, 2, 3, 4, 5, 7, 8, 9]

2、快速排序

快速排序是先找出一个标准数字(一般取数组的第一个数字)一个范围(左标和右标)
根据这个标准数字,
在所有的数字中把所有大于标准数的放在右边,所有小于标准数的放在左边,
左与右标一开始分别在所有数字的最左边与最右边,
当发生数字变换的时候,
如果变换的数字是大于标准数的,则右标减一,
如果变换的数字是小于标准数的,则左标加一,
当左标与右标相等的时候,则该标准数完成了它的使命,开始进行下一个递归
在方法中的下一个递归有两个
一个是在标准数左边的(即小于标准数的一半)参数为起始下标(为当前方法的起始坐标)与左标
另一个是在标准数右边的(即大于标准数的一半)参数为左标+1与终止下标(为当前方法的终止下标)

代码如下

public static void quickSort(int[] arr, int start, int end) {
		// 当左边的标签小于右边的标签才可以进行排序
		if (start < end) {
			// 找到标准数,数组的第0个数字(这里用start的原因是为了适配递归)
			int stard = arr[start];
			// 记录需要排序的左标
			int left = start;
			// 记录需要排序的右标
			int right = end;
			// 循环找比标准数大的数和小的数
			while (left < right) {
				// 右边的数组比标准数大
				while (left < right && stard <= arr[right]) {
				//右标减一
					right--;
				}
				// 使用右边的数字替换左边的数
				arr[left] = arr[right];
				// 如果左边的数字比标准数小
				while (left < right && arr[left] <= stard) {
				//坐标加一
					left++;
				}
				//将左边的数字替换掉右边的数字
				arr[right] = arr[left];
			}
			//这时左与右标相等,都指向中间,将他赋值标准数
			arr[left] = stard;
			// 处理所有的小的数字
			quickSort(arr, start, left);
			// 处理所有的大的数
			quickSort(arr, left + 1, end);
		}
	}

结果

原始数据[3, 4, 6, 7, 2, 7, 2, 8, 0]
排序数据[0, 2, 2, 3, 4, 6, 7, 7, 8]

快速排序之所以叫做快速排序,原因是它适应于较多的数据,它的时间复杂度是O(nlogn),这种函数的特点是刚开始增长较快,数据量越大,消耗的时间越趋于一个常量

3、算法题
题目如下

问题描述
利用字母可以组成一些美丽的图形,下面给出了一个例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。
输入格式
输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。
输出格式
输出n行,每个m个字符,为你的图形。
样例输入
5 7
样例输出
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC

很遗憾我纠结了一上午,也没憋出来,这是网上的做法
是找规律的方法,
当行与列标相同的时候,全为A
当行大于列标的时候,字母为列标减一的ASCII码加一
当行小于列标的时候,字母为行标减一的ASCII码加一
代码如下

public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int[][] a = new int[n][m];
		for (int i = 0; i < a.length; i++) {
			for (int j = 0; j < m; j++) {
				if (i == j) {
					a[i][j] = 65;
				} else if (j > i) {
					a[i][j] = a[i][j - 1] + 1;
				} else if (j < i) {
					a[i][j] = a[i - 1][j] + 1;
				}
				System.out.print((char) a[i][j]);
			}
			System.out.println();
		}
	}

这里用数字表示字母,可以非常方便的以for循环来达到目的(65是A)
结果

8 9
ABCDEFGHI
BABCDEFGH
CBABCDEFG
DCBABCDEF
EDCBABCDE
FEDCBABCD
GFEDCBABC
HGFEDCBAB

明天需要跟上高数的学习了,虽然考研定的目标不是很高,但也不能松懈

今天你最后遇见的那个人有在微笑吗?
——幸运星

发布了13 篇原创文章 · 获赞 8 · 访问量 1111

猜你喜欢

转载自blog.csdn.net/qq_45000228/article/details/104128513