欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于三种排序:冒泡排序、直接排序、快速排序

程序员文章站 2022-05-18 15:30:39
...

1.冒泡排序

​ 冒泡排序是这三种排序中最容易理解的方法,其主要原理是在一串数据中,将第一个数与其它相邻的数比较大小,如果大于其它的数,继续往后比较;如果小于那个数,则用那个数继续与后面的数作比较,最后一串数中最大的那个放在最后,其它的数再继续上一轮的操作,直到比完所有的数。

3,5,2,9,6,1,4,7,8	

3,5,2,6,1,4,7,8         9

3,5,2,6,1,4,7          8   9

3,5,2,6,1,4           7   8   9

​             	    ...

1 2 3 4 5 6 7 8 9

代码如下:

package com;

import java.util.Arrays;
import java.util.Random;

/**
 * 冒泡排序
 * 
 * @author Eryu
 *
 */
public class 冒泡排序 {
	public static void main(String[] args) {
		Random rd = new Random();// 调用随机函数
		System.out.println("随机生成的100以内10个数的数组:");

		int[] buf = new int[10];

		for (int i = 0; i < buf.length; i++) {//for循环将随机到的数输入到数组中
			buf[i] = rd.nextInt(100);
		}
		System.out.println(Arrays.toString(buf));//用toString方法直接将所有的数由数组的方式输出

		for (int i = 0; i < buf.length -1; i++) {//外层循环控制比较轮数
			for (int j = 0; j < buf.length - i -1; j++) {//内层循环控制每一轮数之间比较的次数
				if (buf[j] > buf[j + 1]) {
					buf[j] = buf[j] ^ buf[j + 1];
					buf[j + 1] = buf[j] ^ buf[j + 1];
					buf[j] = buf[j] ^ buf[j + 1];//异或的方式交换j和j+1,也可以用下面哪种方式交换
//					if (array[j] < array[j + 1]) {
//					int temp = array[j];
//					array[j] = array[j + 1];
//					array[j + 1] = temp;
//				}
				}
			}
		}
		System.out.println("排序好的数组为:");
		System.out.println(Arrays.toString(buf));

	}
}


2.直接选择排序

​ 直接选择排序如同其名字一样很直接,就是在一串数字中,假定第一个数最大,然后与其后面的数字作比较,如果后面的数字比它大,就直接和后面的数字交换,再在刚刚的位置往后比较

代码如下:

package com;

import java.util.Arrays;
import java.util.Random;

/**
 * 直接选择排序
 * 
 * @author Eryu
 */
public class 直接选择排序 {
	public static void main(String[] args) {
		Random rd = new Random();
		int[] buf = new int[10];

		for (int i = 0; i < buf.length; i++) {
			buf[i] = rd.nextInt(100);

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

		for (int i = 0; i < buf.length - 1; i++) {// 外层循环控制比较轮数
			for (int j = i; j < buf.length; j++) {// 内心循环控制每一轮比较次数
				if (buf[i] > buf[j]) {
					buf[i] = buf[i] ^ buf[j];
					buf[j] = buf[i] ^ buf[j];
					buf[i] = buf[i] ^ buf[j];

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

3.快速排序

​ 快速排序是所有排序方法中最为快速的排序方法,其原理是取第一个数为标记数,将数组首尾进行比较,如果首位大于末位,则两数进行交换,比较后如果标记数在第一个,则末位的前面一个数再和第一位标记数作比较,大于标记数则不变,小于则交换位置;如果标记数在第一轮被换到了最后一位,则用第一位数后面的数与标记数作比较,如果大于标记数,就交换,再用被交换后的那位数的前面一位和标记数比较,依次类推。最后标记数会别交换到数组的*,标记数前面的数都比它小,后面的数都比它大,然后分为两块,又是两个数组内部作比较,用之前的方法,直到排序完成。

代码如下:

package com;

import java.util.Arrays;
import java.util.Random;

/*
 * 快速排序
 */
public class 快速排序 {
	public static void main(String[] args) {
		int[] buf = new int[10];
		Random rd = new Random();
		for (int i = 0; i < buf.length; i++) {
			buf[i] = rd.nextInt(100);//随机一个数组
		}
		System.out.println(Arrays.toString(buf));
		quickSort(buf, 0, buf.length - 1);//调用下面写的快排方法
		System.out.println(Arrays.toString(buf));
	}

	public static void quickSort(int[] buf, int sta, int end) {
		int m = buf[sta];
		int i = sta;//定义一个起始值的脚标
		int j = end;//定义一个结尾值的脚标

		while (i < j) {//i始终在j的左边
			//初步将小于m的数排到左边,大于m的数排到右边
			while (i < j) {
				if (m > buf[j]) {
					buf[i] = buf[i] ^ buf[j];
					buf[j] = buf[i] ^ buf[j];
					buf[i] = buf[i] ^ buf[j];
					i++;
					break;
				} else {
					j--;
				}
			}
			while (i < j) {
				if (buf[i] > m) {
					buf[i] = buf[i] ^ buf[j];
					buf[j] = buf[i] ^ buf[j];
					buf[i] = buf[i] ^ buf[j];
					j--;
					break;
				} else {
					i++;
				}
			}
		}
		//m左边的数再次快排
		if (i - sta > 1) {
			quickSort(buf, sta, i-1);
		}
		//m右边的数再次快排
		if (end - j > 1) {
			quickSort(buf, i+1, end);
		}
	}
}
相关标签: Java中的三种排序