排序算法----java实现

共同函数交换位置

private static void swap(int[] arr, int i, int j){
	int temp = arr[j];
	arr[j] = arr[i];
	arr[i] = temp;
}

冒泡排序

1) 原理:
设排序表长为n,从后向前或者从前向后两两比较相邻元素的值,如果两者的相对次序不对(A[i-1]> A[i]),则交换它们,其结果是将最小的元素交换到待排序序列的第一个位置,我们称它为一趟冒泡。下一趟冒泡时,前一趟确定的最小元素不再参与比较,待排序序列减少一个元素,每趟冒泡的结果把序列中最小的元素放到了序列的”最前面”。

2) 实现1:

每次比较相邻两个数字;

private static int[] otherMaopaoSort(int[] arr){
	
	for(int i = 0; i < arr.length; i++){
		for(int j = 0; j< arr.length-i-1; j++){
			if (arr[j] > arr[j+1]) {
				swap(arr, j, j+1);
			}
		}
	}
	return arr;
}

实现2:这个实现可能不是冒泡排序,反正基本思想就是对比后相互交换位置,所以自己写了一个,如果效率特别低请指出,

这个排序是这么想的,第一个和第二个比,小的排在第一位,下一次第一个和第三个比,一直比到最后,最小的就在第一个,
然后下一轮循环从第二个开始,一直比到最后这样,

private static int[] selfMaopaoSort(int[] arr){
	
	for(int i = 0; i < arr.length-1; i++){
		for(int j = i+1; j< arr.length; j++){
			if (arr[j] > arr[j+1]) {
				swap(arr, j, j+1);
			}
		}
	}
	return arr;
}

快速排序

1) 原理:
选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。
在这里插入图片描述
可以理解为选择一个基准将数组分两部分,将基准排好,然后令另外两部分找自己的基准然后在分别排好基准,最后一直到最后的基准排好,利用递归函数反复对基准操作,

2) 实现:

private static int[] quickSort(int[] arr, int low, int heigh){
	if (low < heigh) {
		int baseSeq = partition(arr, low, heigh);
		quickSort(arr, low, baseSeq-1);
		quickSort(arr, baseSeq+1, heigh);
	}
	
	return arr;
}

private static int partition(int[] arr, int low, int heigh){
	//基准
	int base = arr[low];
	while (low < heigh) {
		//右侧指针指向数据大于德语基准,则不进行调换,指针前移
		while (low < heigh && arr[heigh] >= base) {
			heigh--;
		}
		//否则进行调换
		swap(arr, low, heigh);
		//左侧指针指向数据小于基准,则不进行调换,指针后移
		while (low < heigh && arr[low] < base) {
			low++;
		}
		//否则进行调换
		swap(arr, low, heigh);
	}
	
	//经过排序后low等于heigh,为基准下标
	return low;
}
注意

一般基准为第一个或者为最后一个,以第一个为例,此时partition方法硬钢先执行指针前移排序,否则第一次的基准不会排序,很简单自己想象就能想到,这只不过是我当时写的时候的坑

直接插入排序

1) 原理:
每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的子序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止。
在这里插入图片描述

2) 实现:

private static int[] insertSort(int[] arr){
	//第一个默认排序好,第一层控制循环次数
	for (int i = 1; i < arr.length; i++) {
		//控制将未排序的后一个数据排到正确的位置
		for (int j = i-1; j >= 0; j--) {
			if (arr[j] > arr[j+1]) {
				nonSwap(arr, j, j+1);
			}
		}
	}
	return arr;
}
/**
 * 不借助中间变量交换两个数的值
 * @param arr
 * @param i
 * @param j
 */
private static void nonSwap(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、付费专栏及课程。

余额充值