一種用Java實現的直接選擇排序算法

                 大家都學習過數據結構,都知道各種各樣的排序方法,比如冒泡排序,選擇排序,堆排序,歸并排序等等,我學習的教材是C語言版的,今天處于好奇,寫了一個用Java語言實現的直接選擇排序的程序,與大家分享一下。
                直接選擇排序的思想是
          n個記錄的文件的直接選擇排序可經過n-1趟直接選擇排序得到有序結果:
           ①初始狀態:無序區為R[1..n],有序區為空。
           ②第1趟排序
               在無序區R[1..n]中選出關鍵字最小的記錄R[k],將它與無序區的第1個記錄R[1]交換,使R[1..1]和R[2..n]分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。
            ……
           ③第i趟排序
            第i趟排序開始時,當前有序區和無序區分別為R[1..i-1]和R[i..n](1≤i≤n-1)。該趟排序從當前無序區中選出關鍵字最小的記錄R[k],將它與無序區的第1個記錄R[i]交換,使R[1..i]和R[i+1..n]分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。
               這樣,n個記錄的文件的直接選擇排序可經過n-1趟直接選擇排序得到有序結果。

          用Java實現的代碼如下:

          /*
           *@author 我為J狂 建立日期 2007-4-16
           *
           
          */

          package net.blogjava.lzqdiy;

          public class MySort
          {

              
          /**
               * 
          @param args
               
          */

              
          public static void main(String[] args)
              
          {
                  
          // TODO Auto-generated method stub
                  int n = Integer.parseInt(args[0]);// 輸入數組長度
                  double R[] = new double[n];
                  
          if (n == 0)
                      System.out.println(
          "數組為空");
                  
          else
                  
          {
                      System.out.println(
          "排序前:");
                      
          for (int i = 0; i < n; i++)
                          R[i] 
          = Double.parseDouble(args[i + 1]);// 輸入數組元素。
                      for (int i = 0; i < n; i++)
                      
          {
                          
          if (i > 0)
                              System.out.print(
          ",");
                          System.out.print(R[i]);
                      }

                      
          double temp = 0;
                      
          for (int i = 0; i < n - 1; i++)
                      
          {
                          
          for (int j = i + 1; j < n; j++)
                          
          {
                              
          if (R[j] < R[i])
                              
          {
                                  temp 
          = R[i];
                                  R[i] 
          = R[j];
                                  R[j] 
          = temp;
                              }

                          }

                      }

                      System.out.println();
                      System.out.println(
          "排序后:");
                      
          for (int i = 0; i < n; i++)
                      
          {
                          
          if (i > 0)
                              System.out.print(
          ",");
                          System.out.print(R[i]);
                      }

                  }

              }

          }

          程序運行過程:

          程序的運行結果是:
          排序前:
          3.6,7.4,2.1,3.3,2.0
          排序后:
          2.0,2.1,3.3,3.6,7.4
          算法分析
          (1)關鍵字比較次數
               無論文件初始狀態如何,在第i趟排序中選出最小關鍵字的記錄,需做n-i次比較,因此,總的比較次數為:
               n(n-1)/2=0(n2)

          (2)記錄的移動次數
               當初始文件為正序時,移動次數為0
               文件初態為反序時,每趟排序均要執行交換操作,總的移動次數取最大值3(n-1)。
               直接選擇排序的平均時間復雜度為O(n2)。

          (3)直接選擇排序是一個就地排序

          (4)穩定性分析
               直接選擇排序是不穩定的
             【例】反例[2,2,1]

          posted on 2007-04-16 11:51 我為J狂 閱讀(4074) 評論(8)  編輯  收藏 所屬分類: Java算法

          評論

          # re: 一種用Java實現的直接選擇排序算法 2007-04-18 08:42 開源英漢機器翻譯

          開源英漢機器翻譯C#.NET項目 www.liebiao.net
          我們邀請你 技術交流  回復  更多評論   

          # re: 一種用Java實現的直接選擇排序算法 2007-11-14 20:42 陳力

          錯了!
            回復  更多評論   

          # re: 一種用Java實現的直接選擇排序算法 2007-11-14 20:56 qq564878494

          你做法是一種很簡單的做法!
          你要知道是第一次是從r[1]-r[n]中選擇一個最小值排序,第二次是從r[2]-r[n]中選擇一個最小的與r[2]排序  回復  更多評論   

          # re: 一種用Java實現的直接選擇排序算法 2007-11-14 21:02 qq564878494

          void SelectSort(SeqList R)
           {
          int i,j,k;
          for(i=1;i<n;i++){//做第i趟排序(1≤i≤n-1)
          k=i;
          for(j=i+1;j<=n;j++) //在當前無序區R[i..n]中選key最小的記錄R[k]
          if(R[j].key<R[k].key)
          k=j; //k記下目前找到的最小關鍵字所在的位置
          if(k!=i){ //交換R[i]和R[k]
          R[0]=R[i];R[i]=R[k];R[k]=R[0]; //R[0]作暫存單元
          } //endif
          } //endfor
          } //SeleetSort
            回復  更多評論   

          # re: 一種用Java實現的直接選擇排序算法 2007-11-14 21:02 qq564878494

          你好想想吧  回復  更多評論   

          # re: 一種用Java實現的直接選擇排序算法[未登錄] 2007-12-07 22:36 天才籃球手

          太簡單了吧,研究生也不過如此啊!  回復  更多評論   

          # re: 一種用Java實現的直接選擇排序算法[未登錄] 2007-12-07 22:37 天才籃球手

          大一學的知識,你真有才,到研究生才會啊!  回復  更多評論   

          # re: 一種用Java實現的直接選擇排序算法 2007-12-08 09:43 我為J狂

          @天才籃球手
          我大一的時候,還沒接觸java,只是接觸了一些C語言,哥們你的口氣可夠大的,這樣不太好吧!  回復  更多評論   

          <2007年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          常用鏈接

          留言簿(11)

          隨筆分類(48)

          文章分類(29)

          常去逛逛

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 邵武市| 炉霍县| 甘洛县| 石楼县| 锦州市| 广饶县| 会同县| 岳阳县| 安宁市| 原阳县| 河南省| 突泉县| 旬邑县| 顺昌县| 龙胜| 青浦区| 常宁市| 大宁县| 翁源县| 斗六市| 南召县| 西宁市| 同江市| 九龙县| 祁连县| 洪洞县| 射阳县| 太湖县| 上蔡县| 阳春市| 正宁县| 尼勒克县| 炎陵县| 濮阳县| 内江市| 武城县| 宜阳县| 如皋市| 平安县| 桃源县| 高阳县|