论坛首页 编程语言技术论坛

【8.04更新】上海华为的一道关于指针方面的编程题

浏览 12484 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-05-14   最后修改:2010-05-14

java希尔排序实现,借用了下arr[0],欢迎拍砖:
        package sort;

import java.util.Random;

public class Test {

	public static void main(String args[]){
		Random random= new Random(6);
		int[] arr = new int[6];
		for(int i=1;i<5;i++){
			arr[i] = (int) (random.nextDouble()*100);
		}
		for(int i=1;i<arr.length;i++){
			System.out.print(arr[i]+" ");
		}
		System.out.println();
		//insertSort(arr);
		shellInsertSort(arr);
		for(int i=1;i<arr.length;i++){
			System.out.print(arr[i]+" ");
		}
		System.out.println();
		System.out.println("the position of first zero is :" + arr[0]);
	}
	private static void insertSort(int[] arr){
		int firstZero = arr[0];
		for(int i=2;i<arr.length;i++){
			if(firstZero == 0){
				if(arr[i-1] == 0 )firstZero = i-1;
				if(arr[i] == 0 )firstZero = i;
			}
			if(arr[i] < arr[i-1]){
				arr[0] = arr[i];
				//arr[i] = arr[i-1];
				
				int insertPos = 0;
				for(int k=i-1;k>=0;k--){
					if(arr[k] > arr[0]){
						arr[k+1] = arr[k];
					}else{
						insertPos = k+1;
						break;
					}
				}
				arr[insertPos] = arr[0];
			}
		}
		arr[0] = firstZero;
	}
	
	private static void shellInsertSort(int[] arr,int inc){
		int firstZero = arr[0];//第一个元素记录的是数字0出现的位置
		for(int i=inc+1;i<arr.length;i++){
			if(firstZero == 0){
				if(arr[i] == 0)firstZero = i;
				if(arr[i-inc] == 0)firstZero = i-inc;
			}
			if(arr[i] < arr[i-inc]){
				arr[0] = arr[i];
				
				int insertPos = i;
				for(int k=i-inc;k>=0;k-=inc){
					if(arr[k] > arr[0]){
						arr[k+inc] = arr[k];
						if(k-inc <= 0){
							insertPos = k;
						}
					}else{
						insertPos = k+inc;
						break;
					}
				}
				arr[insertPos] = arr[0];
			}
		}
		arr[0] = firstZero;
	}
	
	private static void shellInsertSort(int[] arr){
		int[] incs = {7,5,3,1};
		for(int i=0;i<incs.length;i++){
			shellInsertSort(arr,incs[i]);
		}
	}
}
 

 

0 请登录后投票
   发表时间:2010-05-15  
	public static int A(int[] arr){
		int cur = 0;
		for(int i=0; i<arr.length; i++){
			if(arr[i]!=0)
				arr[cur++]=arr[i];
		}
		for(int i=cur; i<arr.length; i++){
			arr[i]=0;
		}
		return cur;
	}
0 请登录后投票
   发表时间:2010-05-19  
chinpom 写道
lzyzizi 写道
楼主的算法好复杂。。。

我是这样想的:根据要求选个排序算法,然后你只要做这样一个判断,就是当是数字0的时候的,他比任何数(包括)都要小,这样排序完0就到最后去了。

好像这样做是最好的,在Java中的话就是写个实现Compartor接口的类,不过就是在返回值的时候,需要遍历一下数组。

 

c里面就是调用一下qsort就行了.

0 请登录后投票
   发表时间:2010-05-19  

java实现

	static int z=0;
	public static void main(String[] args){
		int[] A={1,2,3,0,4,5,7,0,7,5,3,2,0,234,3,0,2,4};
//		int len=A.length;
//	    change(A,len-1);
//		quickSort(A,0,A.length-1);
		huawei(A);
	    for(int a:A){
	    	System.out.print(a +",");
	    } 
	    
	}
	
	public static void huawei(int[] array){
		int len=array.length;
		for(int i=0;i<len;i++){
			z++;
			if(array[i]==0){
				turns(array,i);
				break;
			}
		}
		
	}
	public static void turns(int[] array,int i){
		int len=array.length,temp;
		int j=0;
		for(;i<len-1;i++){
         	                        if(array[i+1]!=0){
        	   		sort(array,i-j,i+1);
        		        }else{
        			  j++;
           			}
		}
	}
	
	public static void sort(int[] A,int i,int j){
		int temp;
		temp=A[i];
		A[i]=A[j];
		A[j]=temp;
	    for(int a:A){
	    } 
	}

 17次  感觉还行

 

1,2,3,4,0,5,7,0,7,5,3,2,0,234,3,0,2,4,
1,2,3,4,5,0,7,0,7,5,3,2,0,234,3,0,2,4,
1,2,3,4,5,7,0,0,7,5,3,2,0,234,3,0,2,4,
1,2,3,4,5,7,7,0,0,5,3,2,0,234,3,0,2,4,
1,2,3,4,5,7,7,5,0,0,3,2,0,234,3,0,2,4,
1,2,3,4,5,7,7,5,3,0,0,2,0,234,3,0,2,4,
1,2,3,4,5,7,7,5,3,2,0,0,0,234,3,0,2,4,
1,2,3,4,5,7,7,5,3,2,234,0,0,0,3,0,2,4,
1,2,3,4,5,7,7,5,3,2,234,3,0,0,0,0,2,4,
1,2,3,4,5,7,7,5,3,2,234,3,2,0,0,0,0,4,
1,2,3,4,5,7,7,5,3,2,234,3,2,4,0,0,0,0,

1,2,3,4,5,7,7,5,3,2,234,3,2,4,0,0,0,0,
 

0 请登录后投票
   发表时间:2010-05-20   最后修改:2010-05-20
	public static void maopao(int[] arra){
		
		boolean flag=false;
		int i=0;
		int swap;
		int length=arra.length-1;
		boolean nozero=false;
		boolean first=true;
		int zeroIndex=-1;
		while(i<length){
			int j=0;
			nozero=true;
			while(j<arra.length-i-1){
				if(arra[j]==0){
					if(first){
						first=false;
						zeroIndex=j;
					}
					swap=arra[j+1];
					arra[j+1]=arra[j];
					arra[j]=swap;
					nozero=false;
				
				}
				j++;
				
			}
			if(nozero){
				break;
			}
		i++;
		}
		System.out.println(zeroIndex);

	}
 

冒泡实现:主要那个排序很难理解,按大小,还是原来顺序

0 请登录后投票
   发表时间:2010-05-20   最后修改:2010-05-20
一个循环就搞掂了.
	public static void main(String[] args) {
		int[] a = { 0, 4, 7, 2, 160, 0, 34, 21, 0, 19, 107 };
		int j = 0;
		for (int i = 0; i < a.length; i++) {
			if (a[i] == 0 && i != a.length - 1 && a[i + 1] != 0) {
				a[j++] = a[i + 1];
				a[i + 1] = 0;
			}
		}

		System.out.println(Arrays.toString(a));
	}
2 请登录后投票
   发表时间:2010-07-21  
第二个算法是错误的
多个0 相近的情况
0 请登录后投票
   发表时间:2010-07-21  
int[] a = { 0, 4, 7, 2, 160, 0, 34, 21, 0, 19, 107 };  
    int j = 0;
    int first = -1;
      
    for (int i = 0; i < a.length; ) {  
       if (a[i] == 0 )
       {
            if (first == -1)
            {
               first  = i;
            }
          i++;         
         
       }  else {
         a[j] = a[i];
         j++;
         i++;
        }
    } 
    for (; j < length; j++)
    {
       a[j] = 0;
    }
0 请登录后投票
   发表时间:2010-08-02   最后修改:2010-08-02
Turbo的代码有个小瑕疵,若第一个元素不为零,则逻辑会出问题。

应为:
public static void main(String[] args) {     

       int[] a = { 7, 2, 160,0, 0, 34, 21, 0, 19, 0,0,0,107 };   
 
       int j = -1;     

       for (int i = 0; i < a.length; i++) {     

           if(j==-1 && a[i]==0)
           {
               j=i;
           }

           if (a[i] == 0 && i != a.length - 1 && a[i + 1] != 0) {    
               a[j++] = a[i + 1];     
               a[i + 1] = 0;     
           }

       }     
    
       System.out.println(Arrays.toString(a)); 
}  
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics