java之数组排序问题

冒泡排序

数组与数据结构紧密相关,数组的常用操作有:排序、查找、搜索。

例子1:数组中有元素5 4 7 9 3

public class HelloWorld {
	public static void main(String[] args) {
		int[] arr = { 5, 4, 7, 9, 3 };
		for (int i = 0; i < arr.length - 1; i++) {
			for (int j = 0; j < arr.length - i - 1; j++) {
				if (arr[j] > arr[j + 1]) {
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}
}

在这里插入图片描述
那么看一下排序情况:

public class HelloWorld {
	public static void main(String[] args) {
		int[] arr = { 5, 4, 7, 9, 3 };
		for (int i = 0; i < arr.length - 1; i++) {
			for (int j = 0; j < arr.length - i - 1; j++) {
				if (arr[j] > arr[j + 1]) {
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
			System.out.println("第"+(i+1)+"次排序");
			for (int k = 0; k < arr.length; k++) {
				System.out.print(arr[k]+" ");
			}
			System.out.println();
		}
	}
}

在这里插入图片描述
从这个图中可以看出外层循环控制排序次数,内层控制每一次排序的序列,可以看出每一次排序就会有一个最大值出来,就像泡泡一样,每一次都冒泡, arr.length - i - 1这个呢,就是每一次排序都会出现最大值排在最后,比如说,第一趟出现1个,第二趟出现两个…,那么这出现的最大值下一趟排序就不要比较了,直接减去i。

快速排序(Quicksort)

1)、快速排序是对冒泡排序的改进

public class HelloWorld {
	public static void main(String[] args) {
		int []arr={7,5,85,8,5,9,3,4,5};
		//调用方法,进行快速排序
		QuickSort(arr, 0, arr.length-1);
		//遍历数组
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}
	//定义方法,用来进行快速排序
	public static void QuickSort(int []arr,int left,int right){
		/*
		 * 进行判断,如果左边索引比右边索引大,是不合法的,直接使用return结束这个方法
		 */
		if (left>right) {				
			return;
		}
		//定义变量保存基准数
		int base=arr[left];
		//定义变量i,指向最左边
		int i=left;
		//定义变量j,指向最右边
		int j=right;
		//当i与j不相遇的时候,在循环中检索
		while(i!=j){
			//先由j从右往左检索比基准数小的,如果检索到比基准数小的就停下
			//如果检索到比基准数大的或者相等的,就继续检索
			while(arr[j]>=base && i<j)
				j--;//j从右往左移动
			//i从左往右检索
			while (arr[i]<=base && i<j) 
				i++;//i从左往右移动
			//当i和j都停下的时候,然后交换i和j位置的元素
			int temp=arr[i];
			arr[i]=arr[j];
			arr[j]=temp;
		}
		//当上面循环条件不成立,也就是i==j,会跳出这个循环,i和j相遇,就把交换基准数这个元素和相遇位置的元素
		//把相遇位置的元素赋值给基准数这个位置的元素
			 arr[left]=arr[i];
			 //把基准数赋值给相遇位置的元素
			arr[i]=base;
			//基准数在这里就归为了,左边的数比它小,右边的数比它大
			//递归调用自身,排基准数左边
			QuickSort(arr, left, i-1);
			//排基准数右边
			QuickSort(arr, j+1, right);
		}
}

2)、对于快速排序里面为什么是先从右边往左边排序,再从左往右,而不是先从左往右,再从右往左呢?

比如数组是:5,4,3,2,1 第一遍循环没问题,1和5交换,数组为 :1,4,3,2,5而第二遍循环就发生问题了,i左往右移动到4的位置,而j也从右往左运动到4的位置(i<j),然后交换就会出现,4,1,3,2,5,此时4比1大还在1的左边。
在这里插入图片描述
有时候想不出来一个排序或其它的立体图形,我一般看的这个网站,推荐一下:数据结构与算法的动态可视化
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java提供了多种数组排序函数。其中一种是使用Arrays类的parallelSort方法进行并行排序。该方法将数组分解为子数组进行排序,然后再将子数组合并起来。当子数组长度达到最小粒度时,使用适当的Arrays.sort方法对子数组进行排序。如果数组长度小于最小粒度,则直接使用Arrays.sort方法进行排序。这个算法需要一个不大于原始数组大小的工作空间,并且可以使用ForkJoin common pool来执行并行任务。\[1\] 另一种排序方法是使用Arrays类的sort方法。该方法可以对整个数组或指定范围内的元素进行排序。可以通过传入自定义的Comparator来实现不同的排序方式,例如升序或降序。\[3\] 此外,还可以使用Collections类的sort方法对集合进行排序。该方法也可以通过传入自定义的Comparator来实现不同的排序方式。\[3\] 总结起来,Java提供了多种排序函数,可以根据需要选择合适的方法进行数组排序。 #### 引用[.reference_title] - *1* *3* [JAVA中的排序函数](https://blog.csdn.net/xqqqiang/article/details/108741374)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Java数组排序](https://blog.csdn.net/weixin_38293453/article/details/89320222)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值