Java中常用的三种排序方法(冒泡排序、选择排序、快速排序)

一、冒泡排序

冒泡排序原理

冒泡排序就是依次比较数组中相邻的两个元素,如果左边比右边大(或者左边比右边小)则进行调换,以此类推,这样第一次排序就把最大(最小)的元素放在最底下。
例如:数组 int[] arr = {8,10,5,12,9,4};
第一轮排序结果为: [8, 5, 10, 9, 4, 12]
第二轮排序结果为: [5, 8, 9, 4, 10, 12]
第三轮排序结果为: [5, 8, 4, 9, 10, 12]
第四轮排序结果为: [5, 4, 8, 9, 10, 12]
第五轮排序结果为: [4, 5, 8, 9, 10, 12]

代码

package com;

import java.util.Arrays;

/**
 * 冒泡排序
 */
public class ArraySort01 {
	public static void main(String[] args) {
		int[] arr = { 8, 10, 5, 12, 9, 4 };
		System.out.println("排序前的数组:" + Arrays.toString(arr));
		for (int j = 1; j < arr.length; j++) {
			for (int i = 0; i < arr.length - j; i++) {
				int type;// 声明一个中间量,用于交换位置使用
				// 每相邻的两个数比较
				if (arr[i] > arr[i + 1]) {
					// 交换位置
					type = arr[i];// 将前面一个元素放到中间量
					arr[i] = arr[i + 1];// 将后面一个元素放到前面的位置
					arr[i + 1] = type;// 将中间量中的元素放到后面的位置
				}
			}
			System.out.println("第" + j + "轮排序后的数组:" + Arrays.toString(arr));
		}

	}
}

选择排序

选择排序就是从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。
例如:数组 int[] arr = {8,10,5,12,9,4};
第一轮排序结果为: [4, 10, 5, 12, 9, 8]
第二轮排序结果为: [4, 5, 10, 12, 9, 8]
第三轮排序结果为: [4, 5, 8, 12, 9, 10]
第四轮排序结果为: [4, 5, 8, 9, 12, 10]
第五轮排序结果为: [4, 5, 8, 9, 10, 12]

代码

package com;

import java.util.Arrays;

/*
 * 选择排序
 */
public class ArraySort02 {
	public static void main(String[] args) {
		int[] arr = { 8, 10, 5, 12, 9, 4 };
         //遍历数组,将最小值的下标赋值给min
		for (int i = 0; i < arr.length - 1; i++) {
			int min = i;
			for (int j = i + 1; j < arr.length; j++) {
				if (arr[min] > arr[j]) {
					min = j;
				}
			}
			//交换位置
			if (i != min) {
				arr[i] = arr[i] ^ arr[min];   //使用异或,可以在不使用中间量的情况下,交换两个数的位置
				arr[min] = arr[i] ^ arr[min];
				arr[i] = arr[i] ^ arr[min];
			}
			System.out.println("第" + (i+1) + "轮排序后的数组:" + Arrays.toString(arr));
		}
	}
}

快速排序

快速排序就是先从数组中选择一个基准值(通常为数组中的第一个元素),然后把比基准值小的元素放到左边,大的放基准值右边,分完后对基准值两边的两个新数组进行重复的操作,

package com;

import java.util.Arrays;

public class ArraySort03 {

	public static void main(String[] args) {
		int[] buf = { 5, 8, 4, 11, 68, 15, 113 };

		quicksort(buf);
		System.out.println(Arrays.toString(buf));
	}

	public static void quicksort(int[] buf) {
		quicksortsys(buf, 0, buf.length-1);
	}

	public static void quicksortsys(int[] buf, int sta, int end) {
		int c = buf[sta]; //基准值
		int i = sta;     
		int j = end;
		int a = 0;

		while (i < j) {
			while (i < j) {   
				//判断数组右边的元素与基准值的大小
				if (buf[j] < c) {
					a = buf[i];
					buf[i] = buf[j];
					buf[j] = a;
					i++;
					break;
				} else {
					j--;
				}
			}
			while (i < j) {
				//判断数组左边的元素与基准值的大小
				if (buf[i] > c) {
					a = buf[i];
					buf[i] = buf[j];
					buf[j] = a;
					j--;
					break;
				} else {
					i++;
				}
			}
		}
		//使用递归, 对基准值两边的数组进行排序
		if (i - sta > 1) {
			quicksortsys(buf, sta, i - 1);
		}
		if (end - i > 1) {
			quicksortsys(buf, i + 1, end);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值