Java中常見排序
本文轉自:http://blog.csdn.net/moonpure/article/details/53174863
1, 直接插入排序
(1)基本思想:在要排序的一組數中,假設前面(n-1) [n>=2] 個數已經是排
好順序的,現在要把第n個數插到前面的有序數中,使得這n個數
也是排好順序的。如此反覆迴圈,直到全部排好順序。
(2)例項
(3)用java實現
- package com.njue;
- publicclass insertSort {
- public insertSort(){
-
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};
- int temp=0;
- for(int i=1;i<a.length;i++){
- int j=i-1;
- temp=a[i];
- for(;j>=0&&temp<a[j];j--){
- a[j+1]=a[j]; //將大於temp的值整體後移一個單位
- }
- a[j+1]=temp;
- }
- for(int i=0;i<a.length;i++)
-
System.out.println(a[i]);
- }
- }
2, 希爾排序(最小增量排序)
(1)基本思想:演算法先將要排序的一組數按某個增量d(n/2,n為要排序數的個數)分成若干組,每組中記錄的下標相差d.對每組中全部元素進行直接插入排序,然後再用一個較小的增量(d/2)對它進行分組,在每組中再進行直接插入排序。當增量減到1時,進行直接插入排序後,排序完成。
(2)例項:
(3)用java實現
- publicclass shellSort {
- publicshellSort(){
-
int a[]={1,54,6,3,78,34,12,45,56,100};
- double d1=a.length;
- int temp=0;
- while(true){
- d1= Math.ceil(d1/2);
- int d=(int) d1;
- for(int x=0;x<d;x++){
- for(int i=x+d;i<a.length;i+=d){
- int j=i-d;
- temp=a[i];
- for(;j>=0&&temp<a[j];j-=d){
- a[j+d]=a[j];
- }
- a[j+d]=temp;
- }
- }
- if(d==1)
- break;
- }
- for(int i=0;i<a.length;i++)
- System.out.println(a[i]);
- }
- }
3.簡單選擇排序
(1)基本思想:在要排序的一組數中,選出最小的一個數與第一個位置的數交換;
然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後一個數比較為止。
(2)例項:
(3)用java實現
- publicclass selectSort {
- public selectSort(){
- int a[]={1,54,6,3,78,34,12,45};
- int position=0;
- for(int i=0;i<a.length;i++){
- int j=i+1;
- position=i;
- int temp=a[i];
- for(;j<a.length;j++){
- if(a[j]<temp){
- temp=a[j];
- position=j;
- }
- }
- a[position]=a[i];
- a[i]=temp;
- }
- for(int i=0;i<a.length;i++)
- System.out.println(a[i]);
- }
- }
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實現
- import java.util.Arrays;
- publicclass HeapSort {
- 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};
- public HeapSort(){
- heapSort(a);
- }
- public void heapSort(int[] a){
- System.out.println("開始排序");
- int arrayLength=a.length;
- //迴圈建堆
- for(int i=0;i<arrayLength-1;i++){
- //建堆
- buildMaxHeap(a,arrayLength-1-i);
- //交換堆頂和最後一個元素
- swap(a,0,arrayLength-1-i);
- System.out.println(Arrays.toString(a));
- }
- }
- private void swap(int[] data, int i, int j) {
- // TODO Auto-generated method stub
- int tmp=data[i];
- data[i]=data[j];
- data[j]=tmp;
- }
- //對data陣列從0到lastIndex建大頂堆
- privatevoid buildMaxHeap(int[] data, int lastIndex) {
- // TODO Auto-generated method stub
- //從lastIndex處節點(最後一個節點)的父節點開始
- for(int i=(lastIndex-1)/2;i>=0;i--){
- //k儲存正在判斷的節點
- int k=i;
- //如果當前k節點的子節點存在
- while(k*2+1<=lastIndex){
- //k節點的左子節點的索引
- int biggerIndex=2*k+1;
- //如果biggerIndex小於lastIndex,即biggerIndex+1代表的k節點的右子節點存在
- if(biggerIndex<lastIndex){
- //若果右子節點的值較大
- if(data[biggerIndex]<data[biggerIndex+1]){
- //biggerIndex總是記錄較大子節點的索引
- biggerIndex++;
- }
- }
- //如果k節點的值小於其較大的子節點的值
- if(data[k]<data[biggerIndex]){
- //交換他們
- swap(data,k,biggerIndex);
- //將biggerIndex賦予k,開始while迴圈的下一次迴圈,重新保證k節點的值大於其左右子節點的值
- k=biggerIndex;
- }else{
- break;
- }
- }
- }
- }
- }
-
5.氣泡排序
(1)基本思想:在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。
(2)例項:
(3)用java實現
- publi cclass bubbleSort {
- public bubbleSort(){
- int a[]={1,54,6,3,78,34,12,45};
- int temp=0;
- for(int i=0;i<a.length;i++){
- for(int j=i+1;j<a.length;j++){
- if(a[i]>a[j]){
- temp=a[i];
-
相關推薦
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