posts - 12, comments - 3, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          2010年1月4日

          快速排序介紹:
          快速排序(Quicksort)是對冒泡法的一種改進(jìn)。由C. A. R. Hoare在1962年提出。

          基本思想是:
          通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個(gè)排序過程可以遞歸進(jìn)行,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列。

           1 package my.sort;
           2 
           3 public class QuickSort {
           4 
           5     static int a[] = { 101113164325456 };
           6 
           7     public static void sort(int L, int R) {
           8         int i = L - 1;
           9         int j = R;
          10         int tmp;
          11         if (L < R) {
          12             for (; i < R;) {
          13                 while (a[++i] > a[R]) {// 從i開始,從前往后掃描,如果發(fā)現(xiàn)大于a[R](數(shù)組最后一個(gè)值),與之對換
          14                     while (j > 0) {
          15                         if (j <= i) {// 如果i == j結(jié)束跳出循環(huán)
          16                             break;
          17                         }
          18                         if (a[--j] < a[R]) {// 從J開始,從后往前掃描,如果發(fā)現(xiàn)小于a[i],與之對換
          19                             tmp = a[j];
          20                             a[j] = a[i];
          21                             a[i] = tmp;
          22                         }
          23                         
          24                     }
          25                     
          26                     tmp = a[i];
          27                     a[i] = a[R];
          28                     a[R] = tmp;
          29                     
          30                     for(int b : a) {
          31                         System.out.print(b + " ");//打印沒一趟排序結(jié)果
          32                     }
          33                     System.out.println();
          34                     
          35                     //把數(shù)組分成兩段排序
          36                     sort(L, i-1);//基準(zhǔn)數(shù)前面的數(shù)據(jù)進(jìn)行排列
          37                     sort(i, R);//基準(zhǔn)數(shù)后面的數(shù)據(jù)排列
          38                 }
          39             }
          40         }
          41 
          42     }
          43 
          44     public static void main(String[] args) {
          45         System.out.println("排序前:");
          46         for (int b : a) {
          47             System.out.print(b + " ");
          48         }
          49         System.out.println("\n排序過程:");
          50         sort(0, a.length - 1);
          51         System.out.println("排序后:");
          52         for (int b : a) {
          53             System.out.print(b + " ");
          54         }
          55         System.out.println();
          56     }
          57 }
          58 

          posted @ 2010-01-17 16:14 創(chuàng)意恒動力 閱讀(348) | 評論 (0)編輯 收藏

          自我理解java linkedlist插入數(shù)據(jù)的算法:
          首先看一下,linkedlist插入源代碼:

           1 public class LinkedList
           2     extends AbstractSequentialList
           3     implements List, Deque, Cloneable, java.io.Serializable
           4 {
           5     private transient Entry header = new Entry(nullnullnull);//初始化時(shí)先實(shí)例一個(gè)header,鏈表頭
           6 
           7 
           8     /**
           9      * Constructs an empty list.//構(gòu)造一個(gè)空鏈表
          10      */
          11     public LinkedList() {
          12         header.next = header.previous = header; //把鏈表頭和尾先連到自己(1)
          13         addBefore(e, header);(2
          14 
          15     }
          16 
          17 .
          18 
          19  public boolean add(E e) {//插入鏈表方法
          20             return true;
          21     }
          22 .
          23 
          24 private static class Entry {//每個(gè)數(shù)據(jù)存放,所要用到的靜態(tài)內(nèi)部類
          25      E element;
          26      Entry next;//后一個(gè)節(jié)點(diǎn)
          27      Entry previous;//接一個(gè)節(jié)點(diǎn)
          28 
          29      Entry(E element, Entry next, Entry previous) {
          30          this.element = element;
          31          this.next = next;
          32          this.previous = previous;
          33      }
          34 }
          35 
          36 
          37 //插入操作方法
          38     private Entry addBefore(E e, Entry entry) {
          39          Entry newEntry = new Entry(e, entry, entry.previous);(3
          40          newEntry.previous.next = newEntry;(4
          41          newEntry.next.previous = newEntry;(5
          42          size++;(6
          43          modCount++;
          44          return newEntry;
          45     }
          46 
          47 
          48 /*其他方法~~*/
          49 
          50 
          
          

          以上部分就是算法所在:(一個(gè)簡單的公式替換過程)

          算法步驟(對應(yīng)上面的編號):

          (1)實(shí)例化一個(gè)header (Entry)

          header.next = header

          header.previous = header

          當(dāng)有第一條數(shù)據(jù)插入鏈表:

          (3)實(shí)例化一個(gè) Entry newEntry (以下簡稱E1)

          E1.next = header

          E1.previous = header.previous

          E1.previous.next = header.previous.next = header.next

          (4)由上面可得:

          newEntry.previous.next = newEntry;

          作用:

          相當(dāng)于 E1.previous.next = header.next = E1

          其實(shí)就是,讓上一個(gè)節(jié)的next指向下一個(gè)節(jié)點(diǎn)數(shù)據(jù)

          所以header.next 的下一個(gè)節(jié)點(diǎn)就是E1

          (5)E1.next.previous = header.previous = E1(這里用得巧妙)

          其實(shí)這個(gè)用法單從E1.next.previous= E1單這么看,很直觀因?yàn)镋1的下一個(gè)節(jié)點(diǎn)數(shù)據(jù)的上一個(gè)節(jié)點(diǎn)就應(yīng)該是E1

          從上面可知,E1.next == header,為什么要把header.previous = E1呢?

          其實(shí)包含著一個(gè)遞歸在里面。

          如果再新增一個(gè)數(shù)據(jù) Entry E2 :

          從上面的代碼可以看出,E2的實(shí)例化過程是:(其實(shí)linkedlist每次新增一個(gè)數(shù)據(jù),都通過header傳值)

          Entry E2 = new Entry(data, header, header.previous);

          注意代碼部分的負(fù)值。關(guān)鍵就是這里,實(shí)例化的時(shí)候,E2.previous = header.previous = E1
          簡單得完成了負(fù)值過程。

          然后 E2.previous.next = E1.next = E2
          E2.next.previous = header.previous = E2 .......(接著插入下一條數(shù)據(jù),如此遞歸)

          (6)記錄鏈表位數(shù)


          涉及到了一個(gè)小小的遞歸算法。

          linkedlist記錄一。完畢。。


          posted @ 2010-01-04 19:23 創(chuàng)意恒動力 閱讀(2533) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 芮城县| 扎鲁特旗| 汝阳县| 买车| 兴安县| 阆中市| 启东市| 鲜城| 安乡县| 行唐县| 安达市| 兴山县| 平远县| 赤壁市| 南城县| 新田县| 衡阳县| 玉山县| 朝阳市| 彭水| 大方县| 静安区| 南投市| 陆丰市| 历史| 元阳县| 涟水县| 德昌县| 阳高县| 易门县| 闽清县| 临西县| 乐陵市| 泾阳县| 巴林左旗| 沁水县| 大宁县| 香河县| 舒兰市| 营口市| 原阳县|