java入门 -- 常见排序算法

1 基本概念

▪ 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。 
▪ 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。

2 冒泡排序

2.1 基本思想

▪ 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
▪ 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
▪ 针对所有的元素重复以上的步骤,除了最后一个。
▪ 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

在这里插入图片描述

2.2 代码表示

public static void main(String[] args) {
		int [] arr= {1,10,20,30,1,90,7,60};
		bubblesort(arr);
//		bubblesort2(arr);
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i]+",");
		}
	}
//大数上浮
	public static void bubblesort(int[] arr) {
		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]) {
					swap(arr,j,j+1);
				}
			}
		}
		
	}
	//小数下沉
	public static void bubblesort2(int[] arr) {
		for (int i = 0; i < arr.length-1; i++) {
			for (int j =arr.length-1; j>i; j--) {
				if(arr[j]<arr[j-1]) {
					swap(arr,j,j-1);
				}
			}
		}
		
	}
	//交换数据
private static void swap(int[] arr,int i,int j) {
		arr[i] = arr[i] + arr[j];
		 arr[j] = arr[i] - arr[j];
		 arr[i] = arr[i] - arr[j];
	}
}

结果
在这里插入图片描述

3 选择排序

3.1 基本思想

▪ 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
▪ 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
▪ 重复第二步,直到所有元素均排序完毕。

在这里插入图片描述

3.2 代码表示

public static void main(String[] args) {
		int [] arr= {20,10,20,30,1,90,7,60};
		jiaohuan(arr);
//		xiaoshu(arr);
//		jiaohuan01(arr);
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i]+",");
		}
	}
	//选择排序
	private static void jiaohuan01(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			 int min =i;
			 for (int j = i; j < arr.length; j++) {
				if(arr[min]>arr[j]) {
					min=j;
				}
			}
			 if(min!=i) {
				 zhuanhuan(arr,i,min);
			 }
		}
	}
	//数据调换
	private static void zhuanhuan(int[] arr,int i,int j) {
		arr[i] = arr[i] + arr[j];
		 arr[j] = arr[i] - arr[j];
		 arr[i] = arr[i] - arr[j];
	}

结果
在这里插入图片描述

4 插入排序

4.1 基本思想

▪ 插入排序的工作方式像许多人排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。拿在左手上的牌总是排序好的,原来这些牌是桌子上牌堆中顶部的牌 。
▪ 插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。

在这里插入图片描述

4.2 代码表示

public static void main(String[] args) {
		int [] arr= {1,10,20,30,1,90,7,60};	
		insertSort(arr);
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i]+",");
		}

	}
	private static void insertSort(int [] arr) {
		for (int i = 1; i < arr.length; i++) {
			for (int j = i; j > 0 && arr[j] < arr[j - 1] ; j--) {
				swap(arr, j, j - 1);
			}
		}
	}
	
	//数据调换
	private static void swap(int[] arr,int i,int j) {
		arr[i] = arr[i] + arr[j];
		 arr[j] = arr[i] - arr[j];
		 arr[i] = arr[i] - arr[j];
	}
}

结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值