[算法]自然数数组的排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[算法]自然数数组的排序相关的知识,希望对你有一定的参考价值。

题目:

给定一个长度为N的整型数组arr,其中有N个互不相等的自然数1~N,请实现arr的排序,但是不要把下标0~N-1位置上的数值通过直接赋值的方式替换成1~N。

要求:时间复杂度为O(N),额外空间复杂度为O(1)。

思路:

1.从左向右遍历arr,假设当前遍历到i位置。

2.if arr[i]==i+1,不需要调整,继续遍历。

3.if arr[i]!=i+1,进行调整。

根据调整功能的方法不同,可以有不同的实现过程。

方法一:

public static void sort1(int[] arr) {
		int tmp = 0;
		int next = 0;
		for (int i = 0; i != arr.length; i++) {
			tmp = arr[i];
			while (arr[i] != i + 1) {
				next = arr[tmp - 1];
				arr[tmp - 1] = tmp;
				tmp = next;
			}
		}
	}

方法二:

public static void sort2(int[] arr) {
		int tmp = 0;
		for (int i = 0; i != arr.length; i++) {
			while (arr[i] != i + 1) {
				tmp = arr[arr[i] - 1];
				arr[arr[i] - 1] = arr[i];
				arr[i] = tmp;
			}
		}
	}

以上是关于[算法]自然数数组的排序的主要内容,如果未能解决你的问题,请参考以下文章

吴裕雄--天生自然数据结构:十大经典排序算法——计数排序

PHP中支持Unicode的自然排序算法?

对字符串中字符进行自然顺序排序(基本类型排序)-冒泡算法实现

自然排序算法

算法排序之堆排序

快速排序-递归实现