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

题目:

给定一个长度为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;
			}
		}
	}
posted @ 2016-02-13 17:04  小魔仙  阅读(729)  评论(0编辑  收藏  举报