长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的交换.将数组中的元素按对应位置放置使得a[i]=i

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_第1张图片

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 = new HashSet();
		for(;count 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;

    	}
}



你可能感兴趣的:(Algorithm)