原文链接:http://blog.****.net/u014659656/article/details/45115573
Question:长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的交换.将数组中的元素按对应位置放置使得a[i]=i;
此题目中的数据很像一个哈希表,但是只能用和0交换的方式进行位置调整。目前只知道算法复杂度为o(n^2)空间复杂度为o(1)的方法。
思路:
从最大的元素值n-1开始,一次将元素放到正确的位置。由于只能和0交换,所以一次操作需要两次对换。1.将第i个元素中的值和0交换,使得a[i]=0;2.将当前最大值curMax(即i)和0交换,从而使得a[i]=curMax=i;3.i--,重复1和2,直到所有的元素对号入座
![长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的交换.将数组中的元素按对应位置放置使得a[i]=i 长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的交换.将数组中的元素按对应位置放置使得a[i]=i](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQwMi83M2U1MjFhODA2YmUzODcxMTlmNzdiOWJjZTJhNWUwYS5wbmc=)
-
package Algorithms;
-
-
import java.util.HashSet;
-
import java.util.Random;
-
import java.util.Set;
-
-
public class Solution {
-
public static void main(String args[]){
-
int n= 8;
-
int[] arr = new int[n];
-
produce(arr,n);
-
System.out.println("排序之前: ");
-
print(arr);
-
System.out.println("----------------------------------");
-
sort(arr);
-
System.out.println("----------------------------------");
-
System.out.println("排序之后: ");
-
print(arr);
-
}
-
-
public static void print(int[] arr){
-
for(int i=0;i<arr.length;i++){
-
System.out.print(" " + arr[i] + " ");
-
}
-
System.out.println();
-
for(int i=0;i<arr.length;i++){
-
System.out.print("[" + i + "]" + " ");
-
}
-
System.out.println();
-
System.out.println();
-
}
-
-
public static void produce(int[] rawArray, int n){
-
Random r = new Random();
-
int rn,count=0;
-
Set<Integer> arr = new HashSet<Integer>();
-
for(;count<n;){ //这里应该是count<n而不是count<=n;如果用小于等于,那么就是死循环,因为当产生n个不重复的数后,所有的数都有了,就会一直continue
-
rn = r.nextInt(n);
-
if(arr.contains(rn)){
-
continue;
-
}
-
arr.add(rn);
-
count ++;
-
rawArray[count-1] = rn;
-
-
//System.out.print(rn + " ");
-
}
-
//System.out.println();
-
}
-
-
-
/**
-
* 调用方法swap_with_zero来对array进行排序
-
*/
-
public static void sort(int[] array) {
-
int len = array.length;
-
if(len <= 1){
-
return;
-
}
-
for(int i = len - 1; i > 0; --i){ //从最后一位开始,将最大的数放到最大位置上,然后依次找次大的放
-
if(array[i] == i) continue; //已经相等,则不交换,避免不必要的重复交换
-
swap_with_zero(array, array[i]); //现将0和最后一位交换,以便将第n最大值换到第n大位置上
-
print(array);
-
int curMax = array[i];
-
for(int j = i; j >= 0; --j){ //找出第n大的数
-
if(array[j] > curMax){
-
curMax = array[j];
-
}
-
}
-
swap_with_zero(array, curMax); //将第n大的数和0互换,从而放到第n大的位置上
-
print(array);
-
}
-
}
-
-
public static void swap_with_zero(int[] array, int number){
-
int len = array.length;
-
int zIndex = -1;
-
int nIndex = -1;
-
for(int i = 0; i < len; ++i){
-
if(array[i] == 0){
-
zIndex = i;
-
}
-
if(array[i] == number){
-
nIndex = i;
-
}
-
}
-
int temp = array[zIndex];
-
array[zIndex] = array[nIndex];
-
array[nIndex] = temp;
-
-
}
-
}