冒泡排序、选择排序、直接插入排序

本文介绍了Java中常见的三种排序算法:冒泡排序、选择排序和直接插入排序。详细阐述了每种排序的工作原理,并提供了优化思路。冒泡排序通过两层循环实现,可以进行优化;选择排序通过每趟选择最小元素来排列;直接插入排序则类似打扑克牌,逐个插入已排序部分。排序算法考虑的主要因素是时间复杂度和空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们来了解一下Java中常见的三种排序方式,这里我们说的是

1.冒泡排序

2.选择排序

3.插入排序

排序中要考虑到的主要因素是时间复杂度和空间复杂度,时间我们可以用

System.currentTimeMillis()这个来查看。

下面我们依次来说明:

1、冒泡排序

所谓冒泡排序就是从前到后遍历选出最大值放到最后一个,然后在遍历剩下的找出剩

下中最大的放到倒数第二个,依次直至遍历到最后一个,也就是最小的放到第一个,

使其有序。下面我们来举例说明:

private static void bubbleSort(int[] array) {
		//冒泡排序
		/*
		 * 稳定: 没有跳跃的比较,所以比较稳定
		 * 时间复杂度:o(n^2)
		 */
		// TODO Auto-generated method stub
		
		System.out.println(System.currentTimeMillis());//程序执行的时间
		int tmp=0;
		for(int i=0;i<array.length;i++){//趟数
			for(int j=0;j<array.length-1-i;j++){//比较的次数
				if(array[j+1]<array[j]){
					tmp=array[j];
					array[j]=array[j+1];
					array[j+1]=tmp;
				}
			}
		}
		System.out.println(System.currentTimeMillis());
		
	}
	public static void main(String[] args) {
		//冒泡排序
		//int[] array={12,43,2,1,54,76};
		int[] array=new int[10000];//随机生成一万个数据;
		for(int i=0;i<array.length;i++){
			array[i]=i;
		}
		bubbleSort(array);
		System.out.println(Arrays.toString(array));
		
	}

这里要说明的是这里有两个for循环嵌套,其中第一个for循环是控制比较的趟数(每一趟选出一个最大值),第二个for是比较的次数(比较相邻两个是中较大的值)。
但这个冒泡排序是有缺憾的,是可以优化的。这里我们说一个简单的优化,如果原来的数组就是有序的,那这个排序还是会选择每一个比较,时间复杂度会很大,于是我们可以这么优化:
在第二个for设计一个int类型标志flg定义为0,如果发生交换,那么flg++,如果flg结果为0,说明没有发生交换,那么数组本身就是有序的。函数如下:

public static void newbbsort(int[] array){
		System.out.println(System.currentTimeMillis());
		int tmp=0;
		for(int i=0;i<array.length;i++){//趟数
		int flg=0;
			for(int j=0;j<array.length-1-i;j++){//比较的次数
				if(array[j+1]<array[j]){
					flg++;
					tmp=array[j];
					array[j]=array[j+1];
					array[j+1]=tmp;
				}
			}
			if(i==0&&flg==0)
			{
				break;
			}
		}
		System.out.println(System.currentTimeMillis());
	}

2、选择排序

选择排序就是从第一趟开始,用第一个元素和剩下中的每一个元素比较,如果比第一个小,就和第一个元素交换值,最后使得第一个元素中的值最小,第二趟选择出第二小的放到第二元素,依次,使得数组有序。下面我们举例说明:

public class Test7 {
	public static void main(String[] args) {
		int[] array={23,45,2,3,657,8};		
		selectSort(array);
		System.out.println(Arrays.toString(array));
	}
	public static void selectSort(int[] array){
		int min;
		int tmp;
		for(int i=0;i<array.length;i++){
			min=i;
			for(int j=i;j<array.length;j++){
				if(array[j]<array[min]){
					min=j;//选出最小值下标
				}
			}
			/*
			 * 将第一个元素和最小值交换
			 */
			tmp=array[i];
			array[i]=array[min];
			array[min]=tmp;
		}
	}
}

如同冒泡排序一般,第一个for循环控制趟数,第二个for循环控制每一趟中比较的次数。

3、直接插入排序

插入排序类似于打扑克牌,从第二张牌开始插入,小的插到大的前面,然后使其有序。再拿第三张牌来,找到合适的位置继续插入,使这三张有序。在第四张直至全部插入有序。举例说明:

public class Test7 {
	public static void main(String[] args) {
		int[] array={23,45,2,3,657,8};		
		InsrtSort(array);
		System.out.println(Arrays.toString(array));
	}
	public static void InsrtSort(int[] array){
		//不稳定
		int temp;
		int j;
		for(int i=1;i<array.length;i++){
			temp = array[i];//从i号位置开始进行排序。
			for(j=i-1;j>=0;j--){
				if(array[j]>temp){
					array[j+1]=array[j];
				}else {//每次排序过后前面已经有序,找到第一个比temp小的。
					break;
				}
			}
			array[j+1]=temp;
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值