现象级排序算法设计:随机排序法(纯整活向博文)

Posted 九死九歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了现象级排序算法设计:随机排序法(纯整活向博文)相关的知识,希望对你有一定的参考价值。

一、前言

  目前已知的几种排序算法都存在着明显的缺陷,例如快速排序,他的缺点在于不稳定,初始序列有序或基本有序时,时间复杂度降为O(n2)。再例如堆排序,他需要自己构建一个数据结构,如果大量进行排序还好,只进行一两个数组的排序就构建一个数据结构未免也有点得不偿失了吧?

  而至于当今最快速的多线程排序法,也是存在着内存开销过大,以及无法适用于不支持多线程技术的编程语言的缺陷。

  因此我特地研究出了一款时空复杂度达到惊人的O((nn)!)的排序算法 —— 随机 · 算法之光 · 计算机救星 · 内存条占满器 · cpu发热机 · 项目经理吐血术 · 排序法!!!

实现原理:

  我们先编写一个返回值为布尔型的函数,它的作用是用来判断数组是否排序成功。

  再编写一个函数,可以对数组中的元素随机打乱。

  最后编写排序用到的函数sort,在这个函数里面会不停地把数组打乱,然后判断是否正确排序,若是则结束运行,否则重新打乱数组重新判断。直到数组被正确地排序。

代码实现:

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

public class RandomSort {

	/**
	 * <p>changeArr返回数组是否顺序正确,changeArr用来随机打乱数组</p>
	 * @param arr 需要被排序的整形数组
	 */
	public static void sort(int[] arr) {
		Random r = new Random();
		while (!judgeArr(arr)) {
			changeArr(arr, r);
			// System.out.println(Arrays.toString(arr));
		}
	}

	/**
	 * <p>随机打乱数组</p>
	 * @param arr 需要被打乱的数组
	 * @param r 随机数生成器
	 */
	private static void changeArr(int[] arr, Random r) {
		for (int i = 0; i < arr.length; i++) {
			int j = r.nextInt(arr.length);
			int temp = arr[i];
			arr[i] = arr[j];
			arr[j] = temp;
		}
	}

	/**
	 * <p>判断数组是否被正确排序</p>
	 * @param arr 需要进行判断的数组
	 * @return 返回数组是否被正确排序
	 */
	private static boolean judgeArr(int[] arr) {
		for (int i = 0; i < arr.length - 1; i++) {
			if (arr[i] > arr[i + 1]) return false;
		}
		return true;
	}

	public static void main(String[] args) throws Exception {
		int[] arr = new int[]{4, 5, 1, 3, 2};
		sort(arr);
		System.out.println("经过排序后的数组:" + Arrays.toString(arr));
	}

}

以上是关于现象级排序算法设计:随机排序法(纯整活向博文)的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法 -- 限时领取

双路快速排序法

随机化快速排序法

算法设计与分析分治法--快速排序的递归和非递归实现

『算法设计_伪代码』快速排序

算法理解—— 快速排序 v2.0