<dfn id="w48us"></dfn><ul id="w48us"></ul>
  • <ul id="w48us"></ul>
  • <del id="w48us"></del>
    <ul id="w48us"></ul>
  • java排序算法

    時間:2024-08-04 08:21:12 JAVA認證 我要投稿

    java排序算法大全

      作為java程序員,你知道java中常用的排序算法有哪些?下面跟yjbys小編一起來看看程序員必須掌握的8大排序算法吧!

      1, 直接插入排序

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

      好順序的,現(xiàn)在要把第n個數(shù)插到前面的有序數(shù)中,使得這n個數(shù)

      也是排好順序的。如此反復(fù)循環(huán),直到全部排好順序。

      (2)實例

      (3)用java實現(xiàn)

      package com.njue;

      public class insertSort {

      public insertSort(){

      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};

      int temp=0;

      for(int i=1;i

      int j=i-1;

      temp=a[i];

      for(;j>=0&&temp

      a[j+1]=a[j]; //將大于temp的值整體后移一個單位

      }

      a[j+1]=temp;

      }

      for(int i=0;i

      System.out.println(a[i]);

      }

      }

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

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

      (2)實例:

      (3)用java實現(xiàn)

      public class shellSort {

      public shellSort(){

      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

      for(int i=x+d;i

      int j=i-d;

      temp=a[i];

      for(;j>=0&&temp

      a[j+d]=a[j];

      }

      a[j+d]=temp;

      }

      }

      if(d==1)

      break;

      }

      for(int i=0;i

      System.out.println(a[i]);

      }

      }

      3.簡單選擇排序

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

      然后在剩下的數(shù)當中再找最小的與第二個位置的數(shù)交換,如此循環(huán)到倒數(shù)第二個數(shù)和最后一個數(shù)比較為止。

      (2)實例:

      (3)用java實現(xiàn)

      public class selectSort {

      public selectSort(){

      int a[]={1,54,6,3,78,34,12,45};

      int position=0;

      for(int i=0;i

      int j=i+1;

      position=i;

      int temp=a[i];

      for(;j

      if(a[j]

      temp=a[j];

      position=j;

      }

      }

      a[position]=a[i];

      a[i]=temp;

      }

      for(int i=0;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)時稱之為堆。在這里只討論滿足前者條件的堆。由堆的定義可以看出,堆頂元素(即第一個元素)必為最大項(大頂堆)。完全二叉樹可以很直觀地表示堆的結(jié)構(gòu)。堆頂為根,其它為左子樹、右子樹。初始時把要排序的數(shù)的序列看作是一棵順序存儲的二叉樹,調(diào)整它們的存儲序,使之成為一個堆,這時堆的根節(jié)點的數(shù)最大。然后將根節(jié)點與堆的最后一個節(jié)點交換。然后對前面(n-1)個數(shù)重新調(diào)整使之成為堆。依此類推,直到只有兩個節(jié)點的堆,并對它們作交換,最后得到有n個節(jié)點的有序序列。從算法描述來看,堆排序需要兩個過程,一是建立堆,二是堆頂與堆的最后一個元素交換位置。所以堆排序有兩個函數(shù)組成。一是建堆的滲透函數(shù),二是反復(fù)調(diào)用滲透函數(shù)實現(xiàn)排序的函數(shù)。

      (2)實例:

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

      建堆:

      交換,從堆中踢出最大數(shù)

      依次類推:最后堆中剩余的最后兩個結(jié)點交換,踢出一個,排序完成。

      (3)用java實現(xiàn)

      import java.util.Arrays;

      public class HeapSort {

      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};

      public HeapSort(){

      heapSort(a);

      }

      public void heapSort(int[] a){

      System.out.println("開始排序");

      int arrayLength=a.length;

      //循環(huán)建堆

      for(int i=0;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數(shù)組從0到lastIndex建大頂堆

      private void buildMaxHeap(int[] data, int lastIndex) {

      // TODO Auto-generated method stub

      //從lastIndex處節(jié)點(最后一個節(jié)點)的父節(jié)點開始

      for(int i=(lastIndex-1)/2;i>=0;i--){

      //k保存正在判斷的節(jié)點

      int k=i;

      //如果當前k節(jié)點的子節(jié)點存在

      while(k*2+1<=lastIndex){

      //k節(jié)點的左子節(jié)點的索引

      int biggerIndex=2*k+1;

      //如果biggerIndex小于lastIndex,即biggerIndex+1代表的k節(jié)點的右子節(jié)點存在

      if(biggerIndex

      //若果右子節(jié)點的值較大

      if(data[biggerIndex]

      //biggerIndex總是記錄較大子節(jié)點的索引

      biggerIndex++;

      }

      }

      //如果k節(jié)點的值小于其較大的子節(jié)點的值

      if(data[k]

      //交換他們

      swap(data,k,biggerIndex);

      //將biggerIndex賦予k,開始while循環(huán)的下一次循環(huán),重新保證k節(jié)點的值大于其左右子節(jié)點的值

      k=biggerIndex;

      }else{

      break;

      }

      }

      }

      }

      }

      5.冒泡排序

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

      (2)實例:

      (3)用java實現(xiàn)

      public class bubbleSort {

      public bubbleSort(){

      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=0;i

      for(int j=0;j

      if(a[j]>a[j+1]){

      temp=a[j];

      a[j]=a[j+1];

      a[j+1]=temp;

      }

      }

      }

      for(int i=0;i

      System.out.println(a[i]);

      }

      }

      6.快速排序

      (1)基本思想:選擇一個基準元素,通常選擇第一個元素或者最后一個元素,通過一趟掃描,將待排序列分成兩部分,一部分比基準元素小,一部分大于等于基準元素,此時基準元素在其排好序后的正確位置,然后再用同樣的方法遞歸地排序劃分的兩部分。

      (2)實例:

      (3)用java實現(xiàn)

      public class quickSort {

      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};

      public quickSort(){

      quick(a);

      for(int i=0;i

      System.out.println(a[i]);

      }

      public int getMiddle(int[] list, int low, int high) {

      int tmp = list[low]; //數(shù)組的第一個作為中軸

      while (low < high) {

      while (low < high && list[high] >= tmp) {

      high--;

      }

      list[low] = list[high]; //比中軸小的記錄移到低端

      while (low < high && list[low] <= tmp) {

      low++;

      }

      list[high] = list[low]; //比中軸大的記錄移到高端

      }

      list[low] = tmp; //中軸記錄到尾

      return low; //返回中軸的位置

      }

      public void _quickSort(int[] list, int low, int high) {

      if (low < high) {

      int middle = getMiddle(list, low, high); //將list數(shù)組進行一分為二

      _quickSort(list, low, middle - 1); //對低字表進行遞歸排序

      _quickSort(list, middle + 1, high); //對高字表進行遞歸排序

      }

      }

      public void quick(int[] a2) {

      if (a2.length > 0) { //查看數(shù)組是否為空

      _quickSort(a2, 0, a2.length - 1);

      }

      }

      }

      7、歸并排序

      (1)基本排序:歸并(Merge)排序法是將兩個(或兩個以上)有序表合并成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然后再把有序子序列合并為整體有序序列。

      (2)實例:

      (3)用java實現(xiàn)

      import java.util.Arrays;

      public class mergingSort {

      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};

      public mergingSort(){

      sort(a,0,a.length-1);

      for(int i=0;i

      System.out.println(a[i]);

      }

      public void sort(int[] data, int left, int right) {

      // TODO Auto-generated method stub

      if(left

      //找出中間索引

      int center=(left+right)/2;

      //對左邊數(shù)組進行遞歸

      sort(data,left,center);

      //對右邊數(shù)組進行遞歸

      sort(data,center+1,right);

      //合并

      merge(data,left,center,right);

      }

      }

      public void merge(int[] data, int left, int center, int right) {

      // TODO Auto-generated method stub

      int [] tmpArr=new int[data.length];

      int mid=center+1;

      //third記錄中間數(shù)組的索引

      int third=left;

      int tmp=left;

      while(left<=center&&mid<=right){

      //從兩個數(shù)組中取出最小的放入中間數(shù)組

      if(data[left]<=data[mid]){

      tmpArr[third++]=data[left++];

      }else{

      tmpArr[third++]=data[mid++];

      }

      }

      //剩余部分依次放入中間數(shù)組

      while(mid<=right){

      tmpArr[third++]=data[mid++];

      }

      while(left<=center){

      tmpArr[third++]=data[left++];

      }

      //將中間數(shù)組中的內(nèi)容復(fù)制回原數(shù)組

      while(tmp<=right){

      data[tmp]=tmpArr[tmp++];

      }

      System.out.println(Arrays.toString(data));

      }

      }

      8、基數(shù)排序

      (1)基本思想:將所有待比較數(shù)值(正整數(shù))統(tǒng)一為同樣的數(shù)位長度,數(shù)位較短的數(shù)前面補零。然后,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以后,數(shù)列就變成一個有序序列。

      (2)實例:

      (3)用java實現(xiàn)

      import java.util.ArrayList;

      import java.util.List;

      public class radixSort {

      int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,101,56,17,18,23,34,15,35,25,53,51};

      public radixSort(){

      sort(a);

      for(int i=0;i

      System.out.println(a[i]);

      }

      public void sort(int[] array){

      //首先確定排序的趟數(shù);

      int max=array[0];

      for(int i=1;i

      if(array[i]>max){

      max=array[i];

      }

      }

      int time=0;

      //判斷位數(shù);

      while(max>0){

      max/=10;

      time++;

      }

      //建立10個隊列;

      List queue=new ArrayList();

      for(int i=0;i<10;i++){

      ArrayList queue1=new ArrayList();

      queue.add(queue1);

      }

      //進行time次分配和收集;

      for(int i=0;i

      //分配數(shù)組元素;

      for(int j=0;j

      //得到數(shù)字的第time+1位數(shù);

      int x=array[j]%(int)Math.pow(10, i+1)/(int)Math.pow(10, i);

      ArrayList queue2=queue.get(x);

      queue2.add(array[j]);

      queue.set(x, queue2);

      }

      int count=0;//元素計數(shù)器;

      //收集隊列元素;

      for(int k=0;k<10;k++){

      while(queue.get(k).size()>0){

      ArrayList queue3=queue.get(k);

      array[count]=queue3.get(0);

      queue3.remove(0);

      count++;

      }

      }

      }

      }

      }

    【java排序算法】相關(guān)文章:

    java五種排序算法匯總07-18

    常見的php排序算法07-24

    關(guān)于Java通用權(quán)限控制的算法06-07

    Java編程中如何實現(xiàn)中文排序08-13

    四種簡單的排序算法的php實現(xiàn)10-18

    常用排序算法之JavaScript實現(xiàn)代碼段06-04

    Java認證輔導(dǎo):Java實現(xiàn)二叉樹遍歷算法10-21

    JAVA認證基礎(chǔ)知識:近似算法(格雷厄姆算法)簡介10-29

    JAVA垃圾收集算法與內(nèi)存泄露的解決方法10-16

    PHP中strnatcmp()函數(shù)“自然排序算法”進行字符串比較用法分析06-06

    主站蜘蛛池模板: 亚洲精品无码AV人在线播放| 人妻少妇偷人精品无码| 免费观看四虎精品成人| 国产中老年妇女精品| 国内精品久久久久久久涩爱| 国产精品99精品久久免费| 蜜臀精品国产高清在线观看| 热99re久久国超精品首页| 久久精品亚洲精品国产色婷| 精品99久久aaa一级毛片| 国产精品久久永久免费| 欧洲精品99毛片免费高清观看| 精品久久久久国产免费| 久久国产精品-久久精品| 精品久久久久久无码专区不卡| 日韩精品人成在线播放| 国产一区二区三区欧美精品| 88久久精品无码一区二区毛片| 99热亚洲色精品国产88| 日本午夜精品一区二区三区电影| 欧美日韩国产中文精品字幕自在自线| 91久久精品国产免费直播| 99热国内精品| 99国产精品无码| 精品熟女少妇av免费久久| 四虎成人精品| 精品无码人妻久久久久久| 亚洲天堂久久精品| 亚洲精品无码av人在线观看| 久久久久久青草大香综合精品| 久久久久久久99精品免费观看| 久久影院综合精品| 国产亚洲精品成人a v小说| 国产成人精品天堂| 欧美精品中文字幕亚洲专区| 久久精品无码一区二区三区免费 | 精品久久久久久国产免费了| 91麻豆国产福利精品| 久久久一本精品99久久精品88 | 国产精品伊人久久伊人电影| 99在线精品视频在线观看|