`
lwcheng1985
  • 浏览: 95545 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

论坛数组排序方法总结

阅读更多

原题:

有一个整数数组,有很多 个元素,如何把零移到最前面,要求算法效率要高。如 0,1,72,3,0,5,9,0,6,51,0,3。移动后为0,0,0,0,1,72,3,5,9,6,51,3。不知JE的牛人们有什么高效的算 法。

补充: 非零元素的位置不能改变的。

地址: http://www.iteye.com/topic/684511

本人笨拙:

1、 自己写的算法:利用数组copy,倒序插入。论坛上也有哥们提到过此算法。代码如下

public class test8 {
    public static void main(String...strings){
        int[] arr1={0,1,72,3,0,5,9,0,6,51,0,3};
        int[] arr2=new int[arr1.length];
        int index1=arr1.length;
        int index2=arr1.length;
        while(index1>0){
            if(arr1[--index1]!=0){
                arr2[--index2]=arr1[index1];
            }
        }
        for(int i=0;i<arr1.length;i++){
            System.out.print(arr2[i]+",");
        }
    }
}

分析:个人感觉速度上可以,占用空间。其中倒序思路与数组紧凑法类似。

2.

数组紧凑法:学习中。。
public class test9 {
     private static int[] array={0,1,72,3,0,5,9,0,6,51,0,3};
      public static int[] move(int [] array) 
       { 
            //自右向左扫描,将所有非零元素紧凑到右侧 
            int low,high; 
           for(low = array.length-1,high=low ; low>=0;low--) 
               if(array[low]!=0) 
                { 
                    array[high] = array[low]; 
                    high -- ;//更新紧凑序列的最左侧元素 
               } 
           //将余下所有元素全部置为0 
           for(;high>=0 ; high--) 
               array[high] = 0; 
           return array; 
       } 
      public static void main(String...strings){
          move(array);
          for(int i=0;i<array.length;i++){
              System.out.print(array[i]+",");
          }
         
      }
}

3:

public class test10 {
private static int[] array = { 0, 1, 72, 3, 0, 5, 9, 0, 6, 51, 0, 3 };

    static void frontzero(int array[]) {
        int zero = array.length - 1, nozero = zero;
        while (nozero >= 0) {

            if (array[zero] == 0 && array[nozero] != 0) {
                array[zero] = array[nozero];
                array[nozero] = 0;
                zero--;
            }
            if (array[zero] != 0)
                zero--;
            if (array[nozero] == 0)
                nozero--;

            if (zero < nozero)
                nozero = zero - 1;
        }
    }

    public static void main(String... strings) {
        frontzero(array);
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + ",");
        }

    }
}
方法 4


public class test11 {
    /**
     * @param args
     */
    public static void main(String[] args) {
        int[] array = new int[] { 0, 1, 72, 73, 0, 5, 9, 0, 6, 51, 0, 0 };
        array = moveZero(array);
        for (int k = 0; k < array.length; k++) {
            System.out.print(array[k]+",");
        }
    }
    /**
     * 从右边边开始找零,如果找到0,就把前面的元素都往后面挪一个位置,并且第一个元素补零,没有的话,就往左边找,理论上需要循环 length-
     * zeroNum 次
     *
     * @param array
     * @return
     */
    public static int[] moveZero(int[] array) {
        // 统计零的个数
        int zeroNum = 0;
        for (int i = array.length - 1; i > 0;) {
            if (array[i] == 0) {
                zeroNum++;
                // 零前面的元素都往后面移动下
                for (int j = i; j > 0; j--) {
                    array[j] = array[j - 1];
                }
                // 移动完后,前面补零
                array[0] = 0;
                if (i < zeroNum) {
                    // 说明前面的都是0了,不用再找了
                    break;
                }
            } else {
                // 没有为零,移动下标,再往前找
                i--;
            }
        }
        return array;
    }

}

方法 5

public class test12 {
      public static void main(String[] args) 
          { 
              int[] array = new int[] { 0, 1, 72, 3, 0, 5, 9, 0, 6, 51, 0, 3, 0, -5, 9, 0, 8, -34, 0, -1 }; 
              int first = 0; 
              System.out.println(Arrays.toString(array)); 
              for (int i = 0; i < array.length; i++) 
              { 
                  if (array[i] == 0) 
                  { 
                      if (first < i) 
                      { 
                          for (int j = i - 1; j >= first; j--) 
                          { 
                              array[j + 1] = array[j]; 
                          } 
                          array[first] = 0; 
                          first++; 
                      } 
                  } 
              } 
              System.out.println(Arrays.toString(array)); 
          } 
}
下班了,就现不错分析了,先mark下,等回头再总结下。上面的代码中感觉有冒泡和快速的思想在里面

上面的算法有好有坏,不做分析。关键是学习大家思路。不同的场景应用不同的算法会更高效。

0
0
分享到:
评论
1 楼 bighero3 2011-01-19  
很好。值得收藏

相关推荐

    C#实现对二维数组排序的方法

    总结来说,本文介绍的C#实现二维数组排序的方法,通过将二维数组转换为`DataTable`并利用其内置的排序功能,提供了一种灵活且高效的解决方案。这种方法不仅适用于各种数据类型,而且保持了原始数组的引用,使得排序...

    用VS2010 C# 数组排序 方法

    本文将深入探讨在Visual Studio 2010环境下使用C#语言进行数组排序的方法,这不仅是初学者理解基本算法概念的良好起点,也是资深开发者优化代码性能的实践指南。 ### 知识点一:C#中的数组定义 在C#中,数组是一种...

    LabVIEW二维数组排序.rar

    总结来说,LabVIEW中的二维数组排序涉及理解二维数组的结构,掌握各种排序方法,包括按行、按列及自定义排序,以及处理数据类型转换和性能优化。熟练掌握这些技能将使你在LabVIEW编程中游刃有余,处理各种数据处理...

    编制一维数组排序程序。数组大小n用全局变量定义,数组数据从文本文件中读入或随机生成。包含冒泡排序、选择排序、插入排序三种排序方法。程序能够选择使用任何一种方法排序。

    在编程领域,数组排序是基础且重要的操作,尤其在数据处理和分析中。这个项目的目标是创建一个一维数组排序程序,它具有灵活性,能够处理不同来源的数据,并提供三种经典的排序算法供用户选择:冒泡排序、选择排序和...

    flex 数组排序

    ### Flex 数组排序知识点 #### 一、简介 在Flex开发中,经常需要对数组进行排序,特别是当处理复杂的二维数组或对象数组时。本文将详细介绍如何使用Flex中的`sortOn`方法对数组进行排序,并给出具体的代码示例。 ...

    .net属性数组排序.rar

    总结来说,.NET属性数组排序的关键在于创建自定义比较器,它能根据对象的属性值进行比较。在ASP.NET环境中,排序可以应用于多种场景,如GridView控件的数据绑定。了解和熟练掌握这种排序技巧对于.NET开发者来说至关...

    二维数组排序

    该程序实现了基于冒泡排序原理的二维数组排序方法: 1. **定义冒泡排序方法**:`public static void sort1(int[][] a)`。 2. **内部排序方法**:`private static void sort11(int x[][], int startRow, int rowNum,...

    iOS模型数组排序

    总结来说,`sortedArrayUsingComparator`是Objective-C中对数组进行自定义排序的强大工具,通过提供自定义的比较Block,我们可以根据业务需求灵活地对模型数组进行排序。在实际开发中,它常用于创建用户友好的列表或...

    易语言文本数组排序模块测试程序源码,易语言文本数组排序模块源

    总结起来,易语言文本数组排序模块是易语言编程中不可或缺的一部分,它提供了对文本数组进行有效排序的手段。通过学习和掌握这一模块,开发者不仅可以提升编程技能,还能更好地解决实际问题,提高软件的用户体验。...

    二维数组如何进行冒泡排序

    ### 二维数组冒泡排序详解 #### 一、引言 冒泡排序是一种简单的排序算法,在数据处理领域有着广泛的应用。对于一维数组而言,冒泡排序实现起来...希望本文能够帮助初学者更好地理解二维数组排序的原理和实现细节。

    asp数组 排序

    3. **排序实现**:需要先提取待排序列的值,用一维数组排序方法进行排序,然后根据排序后的索引调整二维数组的顺序。 ```vbscript ' 假设arr2D为二维数组,按第一列排序 Dim arr1D, sortedIndexes arr1D = Extract...

    c++数组排序

    总结,C++数组排序涉及了多种算法,如冒泡排序、插入排序、选择排序、快速排序、归并排序和堆排序。理解并熟练掌握这些算法,对于提升编程能力、优化代码性能以及解决实际问题都至关重要。在实际编程中,开发者应...

    易语言字节型数组排序

    总结,易语言字节型数组排序涉及到数据结构、排序算法以及易语言的语法特性。掌握这些知识,能够帮助程序员高效地处理字节型数组,优化程序性能。通过学习和实践,可以进一步理解排序原理,提升编程能力。

    PHP数组排序函数合集 以及它们之间的联系分析

    总结来说,PHP数组排序函数为开发者提供了灵活多样的选择,通过掌握这些函数及其参数的不同组合,可以实现复杂且高效的数据排序操作。对于需要按照特定逻辑排序的场景,我们可以编写自定义比较函数,通过u参数来传递...

    最简单易懂的java数组排序方法整理

    Java数组排序方法总结 Java数组排序是Java编程中一个非常重要的概念,用于对数组中的元素进行排序。在实际开发中,我们经常需要对数组进行排序,以便更方便地进行数据处理和分析。本文将为大家介绍最简单易懂的Java...

    C语言数组排序总结.pdf

    【C语言数组排序总结】 C语言是编程领域中基础且重要的语言之一,它提供了丰富的功能,包括对数组的处理和排序。数组排序是程序设计中常见的任务,它涉及到数据的组织和操作。本文将总结C语言中几种常用的数组排序...

    C语言数组的数组 排序,删除,查找联合搬

    总结,C语言中的数组操作是程序设计的基础,理解并掌握各种排序、删除和查找算法及其优化方法对于提升代码效率至关重要。联合搬算法提供了一种思路,帮助我们在处理复杂数据操作时提高效率。在实践中,我们需要灵活...

    MATLAB之数组排序

    总结,MATLAB中的数组排序功能强大且灵活,无论是简单的升序或降序排序,还是复杂的自定义排序,甚至是与其他操作的结合,都能满足各种需求。熟练掌握这些技巧,将极大地提高MATLAB编程的效率和数据处理能力。在实际...

    C#随机数,C#数组的排序,反转

    总结来说,C#的随机数生成是通过Random类实现的,数组的排序依赖于Array.Sort方法,而反转则借助于Array.Reverse方法。这些基本操作是C#程序员必须掌握的技能,因为它们在日常编程任务中非常常见。通过熟练运用这些...

    易语言源码文本数组排序.rar

    《易语言源码文本数组排序》 易语言,作为一款以中文编程为特色的编程环境,以其易学易用的特点深受广大...通过对"文本数组排序.e"的分析和实践,我们可以掌握易语言中数组排序的实现方法,进一步提升我们的编程能力。

Global site tag (gtag.js) - Google Analytics