1. 程式人生 > >Java中常見排序

Java中常見排序

本文轉自:http://blog.csdn.net/moonpure/article/details/53174863

1,  直接插入排序

(1)基本思想:在要排序的一組數中,假設前面(n-1) [n>=2] 個數已經是排

好順序的,現在要把第n個數插到前面的有序數中,使得這n個數

也是排好順序的。如此反覆迴圈,直到全部排好順序。

2)例項

(3)用java實現

  1.    package com.njue;  
  2. publicclass insertSort {  
  3. public insertSort(){  
  4.      int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};  
  5.     int temp=0;  
  6.     for(int i=1;i<a.length;i++){  
  7.        int j=i-1;  
  8.        temp=a[i];  
  9.        for(;j>=0&&temp<a[j];j--){  
  10.        a[j+1]=a[j];                       //將大於temp的值整體後移一個單位  
  11.        }  
  12.        a[j+1]=temp;  
  13.     }  
  14.     for(int i=0;i<a.length;i++)  
  15.        System.out.println(a[i]);  
  16. }  
  17. }  

2,  希爾排序(最小增量排序)

1)基本思想:演算法先將要排序的一組數按某個增量dn/2,n為要排序數的個數)分成若干組,每組中記錄的下標相差d.對每組中全部元素進行直接插入排序,然後再用一個較小的增量(d/2)對它進行分組,在每組中再進行直接插入排序。當增量減到1時,進行直接插入排序後,排序完成。

2)例項:

(3)用java實現

  1. publicclass shellSort {  
  2. publicshellSort(){  
  3.     int a[]={1,54,6,3,78,34,12,45,56,100};  
  4.     double d1=a.length;  
  5.     int temp=0;  
  6.     while(true){  
  7.        d1= Math.ceil(d1/2);  
  8.        int d=(int) d1;  
  9.        for(int x=0;x<d;x++){  
  10.            for(int i=x+d;i<a.length;i+=d){  
  11.               int j=i-d;  
  12.               temp=a[i];  
  13.               for(;j>=0&&temp<a[j];j-=d){  
  14.               a[j+d]=a[j];  
  15.               }  
  16.               a[j+d]=temp;  
  17.            }  
  18.        }  
  19.        if(d==1)  
  20.            break;  
  21.     }  
  22.     for(int i=0;i<a.length;i++)  
  23.        System.out.println(a[i]);  
  24. }  
  25. }  

3.簡單選擇排序

1)基本思想:在要排序的一組數中,選出最小的一個數與第一個位置的數交換;

然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後一個數比較為止。

2)例項:

3)用java實現

  1. publicclass selectSort {  
  2.     public selectSort(){  
  3.        int a[]={1,54,6,3,78,34,12,45};  
  4.        int position=0;  
  5.        for(int i=0;i<a.length;i++){  
  6.            int j=i+1;  
  7.            position=i;  
  8.            int temp=a[i];  
  9.            for(;j<a.length;j++){  
  10.            if(a[j]<temp){  
  11.               temp=a[j];  
  12.               position=j;  
  13.            }  
  14.            }  
  15.            a[position]=a[i];  
  16.            a[i]=temp;  
  17.        }  
  18.        for(int i=0;i<a.length;i++)  
  19.            System.out.println(a[i]);  
  20.     }  
  21. }  

4,堆排序

(1)基本思想:堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進。

堆的定義如下:具有n個元素的序列(h1,h2,...,hn),當且僅當滿足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1)(i=1,2,...,n/2)時稱之為堆。在這裡只討論滿足前者條件的堆。由堆的定義可以看出,堆頂元素(即第一個元素)必為最大項(大頂堆)。完全二叉樹可以很直觀地表示堆的結構。堆頂為根,其它為左子樹、右子樹。初始時把要排序的數的序列看作是一棵順序儲存的二叉樹,調整它們的儲存序,使之成為一個堆,這時堆的根節點的數最大。然後將根節點與堆的最後一個節點交換。然後對前面(n-1)個數重新調整使之成為堆。依此類推,直到只有兩個節點的堆,並對它們作交換,最後得到有n個節點的有序序列。從演算法描述來看,堆排序需要兩個過程,一是建立堆,二是堆頂與堆的最後一個元素交換位置。所以堆排序有兩個函式組成。一是建堆的滲透函式,二是反覆呼叫滲透函式實現排序的函式。

(2)例項:

初始序列:46,79,56,38,40,84

建堆:

交換,從堆中踢出最大數

剩餘結點再建堆,再交換踢出最大數

依次類推:最後堆中剩餘的最後兩個結點交換,踢出一個,排序完成。

(3)用java實現

  1. import java.util.Arrays;  
  2. publicclass HeapSort {  
  3.      inta[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};  
  4.     public  HeapSort(){  
  5.        heapSort(a);  
  6.     }  
  7.     public  void heapSort(int[] a){  
  8.         System.out.println("開始排序");  
  9.         int arrayLength=a.length;  
  10.         //迴圈建堆  
  11.         for(int i=0;i<arrayLength-1;i++){  
  12.             //建堆  
  13.             buildMaxHeap(a,arrayLength-1-i);  
  14.             //交換堆頂和最後一個元素  
  15.             swap(a,0,arrayLength-1-i);  
  16.             System.out.println(Arrays.toString(a));  
  17.         }  
  18.     }  
  19.     private  void swap(int[] data, int i, int j) {  
  20.         // TODO Auto-generated method stub  
  21.         int tmp=data[i];  
  22.         data[i]=data[j];  
  23.         data[j]=tmp;  
  24.     }  
  25.     //對data陣列從0到lastIndex建大頂堆  
  26.     privatevoid buildMaxHeap(int[] data, int lastIndex) {  
  27.         // TODO Auto-generated method stub  
  28.         //從lastIndex處節點(最後一個節點)的父節點開始  
  29.         for(int i=(lastIndex-1)/2;i>=0;i--){  
  30.             //k儲存正在判斷的節點  
  31.             int k=i;  
  32.             //如果當前k節點的子節點存在  
  33.             while(k*2+1<=lastIndex){  
  34.                 //k節點的左子節點的索引  
  35.                 int biggerIndex=2*k+1;  
  36.                 //如果biggerIndex小於lastIndex,即biggerIndex+1代表的k節點的右子節點存在  
  37.                 if(biggerIndex<lastIndex){  
  38.                     //若果右子節點的值較大  
  39.                     if(data[biggerIndex]<data[biggerIndex+1]){  
  40.                         //biggerIndex總是記錄較大子節點的索引  
  41.                         biggerIndex++;  
  42.                     }  
  43.                 }  
  44.                 //如果k節點的值小於其較大的子節點的值  
  45.                 if(data[k]<data[biggerIndex]){  
  46.                     //交換他們  
  47.                     swap(data,k,biggerIndex);  
  48.                     //將biggerIndex賦予k,開始while迴圈的下一次迴圈,重新保證k節點的值大於其左右子節點的值  
  49.                     k=biggerIndex;  
  50.                 }else{  
  51.                     break;  
  52.                 }  
  53.             }  
  54.         }  
  55.     }  
  56. }  
  57. 5.氣泡排序

    (1)基本思想:在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。

    (2)例項:

    (3)用java實現

    1. publi cclass bubbleSort {  
    2. public bubbleSort(){  
    3.     int a[]={1,54,6,3,78,34,12,45};  
    4.     int temp=0;  
    5.     for(int i=0;i<a.length;i++){  
    6.        for(int j=i+1;j<a.length;j++){  
    7.        if(a[i]>a[j]){  
    8.            temp=a[i];  
    9. 相關推薦

      Java常見排序演算法詳解

      插入排序 基本思想:從陣列的第二個元素開始,若比前一個元素小,就向前移動(若大於就不用移動),直到插入到合適的位置,然後再去排第三個元素,依次類推,最後一個插入到合適位置時,陣列的排序就完成了。 流程如圖所示: 程式碼如下: /** * 直接插入排序 * @date 2018

      Java常見排序

      本文轉自:http://blog.csdn.net/moonpure/article/details/53174863 1,  直接插入排序 (1)基本思想:在要排序的一組數中,假設前面(n-1) [n>=2] 個數已經是排 好順序

      Java開發常見排序演算法彙總

      Java程式設計中的排序演算法可以分為兩大類: 1、非線性時間比較類排序:通過比較來決定元素間的相對次序,由於其時間複雜度不能突破O(nlogn),因此稱為非線性時間比較類排序。 2、線性時間非比較類排序:不通過比較來決定元素間的相對次序,它可以突破基於比較排序的時間下界,以線性時間執行,

      Java常見的陣列排序演算法(包括冒泡,選擇,插入,快速排序)

      1 public static void bubbleSort(int[] arr) { 2 3    for(int x=0; x<arr.length-1; x++) { 4 5    for(int y=0; y<arr.length-x-

      Java常見的註解

      ise rri 自帶 com doc ret not article 標識 Java中常見的註解 [email protected]/* */ @Deprecated @Suppvisewarnings 常見第三方註解 Spring:@Autowired

      楊恒說李的算法好-我問你聽誰說的-龍哥說的(java常見的List就2個)(list放入的是原子元素)

      ron 2個 常用 span color 原子 ges pan col 1.List中常用的 方法集合: 函數原型 ******************************************* *****************************

      java常見對象——基本包裝類

      fin java clas -128 public idt pen font 1.0 為了對基本數據類型進行更多的操作,更方便的操作,Java就針對每一種基本數據類型提供了對應的類類型。包裝類類型: byte Byte

      Java常見數據結構:list與map -底層如何實現

      增強for 繼續 lin lec -- 什麽 num nsvalue index 1:集合 2 Collection(單列集合) 3 List(有序,可重復) 4 ArrayList 5

      Java常見數據結構Set之HashSet

      顯示 clas src 項目開發 style created ide value 存儲 今天來說說Java集合中的Set系列之HashSet。 Set我們眾所周知的就是慮重功能, 我們平時在項目開發中也常用到這個特性的。那麽Set為何能夠慮重呢? 接下來我們就看下源

      java常見的類,接口,包,異常

      tex 權限 array 變量 都是 run 做的 pointer 數組下標                       java中常見的類,接口,包,異常 類   String  Integer  Long   File   Date  Thread(java.lang.

      Java常見的比較器的實現方法

      ati 算法 equals equal util get stat 不想 sort 在Java中經常會涉及到對象數組的排序問題,那麽就涉及到對象之間的比較問題。通常對象之間的比較可以從兩個方面去看:第一個方面:對象的地址是否一樣,也就是是否引用自同一個對象。這種方式可以直接

      Java常見的集合類比較

      對象 數組實現 ash arraylist lis tab cto 集合類 collect Collection 是對象集合, Collection 有兩個子接口 List 和 Set,List 可以通過下標 (1,2..) 來取得值,值可以重復,而 Set 只能通過遊標來

      java常見的math方法

      java中常見的math方法 java.lang.Math : 隨機: static double random()      返回一個介於[0,1)之間的隨機數 拓展: Math.ceil(Math.random()*10);返

      java常見的執行緒池(不看後悔,一看必懂)

      Executor介面表示執行緒池,它的execute(Runnable task)方法用來執行Runnable型別的任務,ExecutorService是Executor的子介面,聲明瞭管理執行緒池的一些方法 Java.util.concurrent.Executors類包含了一些靜態

      Java常見的異常處理彙總

      1. java.lang.nullpointerexception  這個異常大家肯定都經常遇到,異常的解釋是"程式遇上了空指標",簡單地說就是呼叫了未經初始化的物件或者是不存在的物件,這個錯誤經常出現在建立圖片,呼叫陣列這些操作中,比如圖片未經初始化,或者圖片建立時的路徑錯誤等等。對陣列操作中出現

      Java常見死鎖的例項

      順序死鎖:過度加鎖,導致由於執行順序的原因,互相持有對方正在等待的鎖 資源死鎖:多個執行緒在相同的資源上發生等待 由於呼叫順序而產生的死鎖 public class Test { Object leftLock = new Object(); Object rightLock

      java常見的8種異常語句

      Java中常見的8種異常語句 ArithMetException(算數異常類) NulltinterException(空指標異常) ClassCastException(類轉換異常) NegetiveArrayException(陣列負下標) Array

      Java常見圖形繪製方式與實現

      分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

      java常見的package

      java.lang:這個是系統的基礎類,比如 String 等都是這裡面的,這個 package 是唯一一個可以不用 import 就 可以使用的 Package java.io: 這裡面是所有輸入輸出有關的類,比如檔案操作等 java.net: 這裡面是與網路有關的類,比如 URL,URL

      Java常見死鎖與活鎖的例項

      順序死鎖:過度加鎖,導致由於執行順序的原因,互相持有對方正在等待的鎖 資源死鎖:多個執行緒在相同的資源上發生等待 由於呼叫順序而產生的死鎖 public class Test { Object leftLock = new Object(); Ob