好好生活,努力工作,天天向上!

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            46 Posts :: 1 Stories :: 178 Comments :: 0 Trackbacks

             真的是越來越喜歡Scala了,簡潔的語法,清新的風格是我對Scala的印象,感覺使用Scala進行編程真的非常的方便,從Scala的設計思想也能得到不少的啟發,就比如下面的一個對數字數組快速排序的sort(Array[Int])方法,你以前想到過通過這樣的方式實現嗎?

          /**
           * 快速排序的例子2
           * 
          @author VWPOLO
           * <p>2009-8-12</p>
           
          */
          object TestQuickSort2 {
            def main(args : Array[String]) : Unit 
          = {
              var arrays 
          = Array(123,343,5435,23,3213);
              Console.println(
          "排序前的結果");
              arrays.foreach((array: Int ) 
          => println(array))
              arrays 
          = sort(arrays);
              Console.println(
          "排序后的結果");
              arrays.foreach((array: Int ) 
          => println(array))
            }
            
            def sort(xs: Array[Int]):Array[Int] 
          = {
              
          if(xs.length <= 1)
                xs;
              
          else {
                val pivot 
          = xs(xs.length /2);
                Array.concat(
                    sort(xs filter (pivot 
          >)),
                         xs filter (pivot 
          ==),
                    sort(xs filter (pivot 
          <))
                )
              }
            }
          }

              sort(Array[Int])方法通過簡明的方式完成了傳統的快速排序功能:

                1、判斷參數數組是否為空?如果為空說明排序完成,直接方法參數。

                2、如果給定的參數數字不為空,取得數組的中間數。

                3、根據中間數對參數數組進行拆分,通過調用Arrayfilter(pA => Boolean)方法對數組進行分區并生成一個新的數組,"xs filter (pivot >)生成一個新的數組只包含小于pivot的數字,"xs filter (pivot ==)"里面的數組只包含等于pivot的數組,"xs filter (pivot <)"則包含大于pivot的數字,通過sort方法的迭代,完成了排序過程。

                4、通過Array.concat方法合并多個數組,返回排序后的結果就行了。


              sort方法指定了返回值但是方法塊中沒有"return" 語言,其實加不加都無所謂,Scala編譯器可以自動進行判斷。

              這種方式和傳統的快速排序方法在時間復雜度和空間復雜度相似,但是代碼卻大大的簡化了,不信你用Java寫一個對數字數組快速的排序方法(要自己寫,使用Collections.sort(List<T>)方法可不算啊)。

              Scala引起了大家的大量關注,一些人拿Scala的缺點和Java的優點進行比較進行批評Scala"另一些人拿Java缺點和Scala優點進行比較來擁護Scala,然后兩隊人在論壇上打起了口水仗,Scala又不是鈔票,當然不能夠取悅所有人。


              參考資料:Scala By Example
           

          posted on 2009-08-13 09:02 VWPOLO 閱讀(1602) 評論(6)  編輯  收藏 所屬分類: Java 技術

          Feedback

          # re: Scala 的快速排序 2009-08-13 10:19 Johnny Jian
          Console.println("排序前的結果");
          arrays.foreach((array: Int ) => println(array))

          =>

          println("排序前的結果")
          arrays.foreach(println)  回復  更多評論
            

          # re: Scala 的快速排序 2009-08-13 10:23 VWPOLO
          @Johnny Jian
          不錯,這樣更簡潔!  回復  更多評論
            

          # re: Scala 的快速排序[未登錄] 2009-08-13 11:20 dennis
          這里并不是scala的優雅,而是遞歸的優雅。scala的語法談不上優美,反而是晦澀。  回復  更多評論
            

          # re: Scala 的快速排序 2009-08-14 00:40 Net4J
          不還覺得Groovy的順眼.  回復  更多評論
            

          # re: Scala 的快速排序 2009-08-14 22:44 Johnny Jian
          @Net4J
          贊成
          同樣的程序用Groovy寫:
          def sort(xs) {
          if (xs.size() <= 1)
          xs
          else {
          def pivot = xs[xs.size() / 2 as int]
          sort(xs.findAll { it < pivot }) +
          xs.findAll { it == pivot } +
          sort(xs.findAll { it > pivot })
          }
          }
          def array = [123, 343, 5435, 23, 3213]
          println array
          array = sort(array)
          println array

          或者用groupBy方法:
          def sort(xs) {
          if (!xs)
          []
          else {
          def pivot = xs[xs.size() / 2 as int]
          def m = xs.groupBy { it <=> pivot }
          sort(m[-1]) + m[0] + sort(m[1])
          }
          }
          def array = [123, 343, 5435, 23, 3213]
          println array
          array = sort(array)
          println array  回復  更多評論
            

          # re: Scala 的快速排序 2009-08-15 09:53 VWPOLO
          @Johnny Jian
          只能說蘿卜白菜,各有所愛了  回復  更多評論
            

          主站蜘蛛池模板: 冀州市| 通州市| 南部县| 汉源县| 新巴尔虎右旗| 若羌县| 收藏| 衡山县| 讷河市| 永泰县| 开化县| 龙胜| 玛纳斯县| 卢湾区| 井陉县| 青龙| 错那县| 乌兰察布市| 揭东县| 攀枝花市| 霍邱县| 读书| 宜都市| 伊金霍洛旗| 砀山县| 安塞县| 闽侯县| 福海县| 饶河县| 牡丹江市| 三都| 来宾市| 靖州| 五寨县| 泊头市| 榆社县| 淅川县| 板桥市| 马边| 富顺县| 博湖县|