Java选择排序

选择排序: 思路: 1、首先拿数组第一个元素依次与除其自身外的其他每个元素顺序比较,如果第一个元素大于剩下的某个元素,就互换内 容。 2、经过第一轮比较之后,此时第一个元素就是数组中最小的元素。然后再拿第二个元素与除第一个元素和其自身的元素 进行比较,如果第二个元素大于剩下的某个元素,就互换内容。 3、依次类推,直到最后一个元素。

具体流程如下图所示:

 

代码:

public class SelectSort {

	public static void main(String[] args) {
		int[] arr = { 89, 34, -270, 17, 3, 100 };
		System.out.print("排序前数组:");
		printArray(arr);
		selectSort(arr);
		System.out.print("排序后数组:");
		printArray(arr);

	}

	public static void selectSort(int[] arr) {
		for (int x = 0; x < arr.length - 1; x++) {
			for (int y = x + 1; y < arr.length; y++) {
				if (arr[x] > arr[y]) {
					int temp = arr[x];
					arr[x] = arr[y];
					arr[y] = temp;
				}
			}
		}
	}

	public static void printArray(int[] arr) {
		System.out.print("[");
		for (int x = 0; x < arr.length; x++) {
			if (x != arr.length - 1)
				System.out.print(arr[x] + ",");
			else
				System.out.println(arr[x] + "]");
		}
	}

}

上面的选择排序算法效率比较低,因为数组每一个元素与剩下的元素比较就是为了获得最小的元素并且与之互换。例 如:{89,34,-270,17,3,100}这个数组,第一轮就要互换 4 次才能使第一个元素存储的是这个数组中最小的元素。如果是 这样,那么更高效率的方式则是只需要通过两个变量,一个记录最小值,一个记录最小值所在的角标即可。等当前元素 与余下的所有元素比较完,直接互换,这样只需互换一次就能达到目标,效率自然就会提高。 

代码:

public class SelectSort2 {

	public static void main(String[] args) {
		int[] arr = { 89, 34, -270, 17, 3, 100 };
		System.out.print("排序前数组:");
		printArray(arr);
		selectSort(arr);
		System.out.print("排序后数组:");
		printArray(arr);
	}

	public static void selectSort(int[] arr) {
		for (int x = 0; x < arr.length - 1; x++) {
			int num = arr[x];
			int index = x;
			for (int y = x + 1; y < arr.length; y++) {
				if (num > arr[y]) {
					num = arr[y];
					index = y;
				}
			} // 如果最小的就是自己,就没有必要执行 swap 操作
			if (index != x)
				swap(arr, x, index);
		}
	}

	public static void swap(int[] arr, int a, int b) {
		int temp = arr[a];
		arr[a] = arr[b];
		arr[b] = temp;
	}

	public static void printArray(int[] arr) {
		System.out.print("[");
		for (int x = 0; x < arr.length; x++) {
			if (x != arr.length - 1)
				System.out.print(arr[x] + ",");
			else
				System.out.println(arr[x] + "]");
		}
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值