大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學(xué)習(xí)攻略 Java學(xué)習(xí) Java排序算法代碼

Java排序算法代碼

更新時(shí)間:2022-11-04 11:19:21 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1348次

Java排序算法代碼是什么?動(dòng)力節(jié)點(diǎn)小編來告訴大家。

1.直接插入排序

我們經(jīng)常會到這樣一類排序問題:把新的數(shù)據(jù)插入到已經(jīng)排好的數(shù)據(jù)列中。將第一個(gè)數(shù)和第二個(gè)數(shù)排序,然后構(gòu)成一個(gè)有序序列將第三個(gè)數(shù)插入進(jìn)去,構(gòu)成一個(gè)新的有序序列。對第四個(gè)數(shù)、第五個(gè)數(shù)……直到最后一個(gè)數(shù),重復(fù)第二步。如題所示:

直接插入排序(Straight Insertion Sorting)的基本思想:在要排序的一組數(shù)中,假設(shè)前面(n-1) [n>=2] 個(gè)數(shù)已經(jīng)是排好順序的,現(xiàn)在要把第n個(gè)數(shù)插到前面的有序數(shù)中,使得這n個(gè)數(shù)也是排好順序的。如此反復(fù)循環(huán),直到全部排好順序。

代碼實(shí)現(xiàn):

首先設(shè)定插入次數(shù),即循環(huán)次數(shù),for(int i=1;i

設(shè)定插入數(shù)和得到已經(jīng)排好序列的最后一個(gè)數(shù)的位數(shù)。insertNum和j=i-1。

從最后一個(gè)數(shù)開始向前循環(huán),如果插入數(shù)小于當(dāng)前數(shù),就將當(dāng)前數(shù)向后移動(dòng)一位。

將當(dāng)前數(shù)放置到空著的位置,即j+1。

代碼如下:

public void insertSort(int [] a){
        int len=a.length;//單獨(dú)把數(shù)組長度拿出來,提高效率
        int insertNum;//要插入的數(shù)
        for(int i=1;i<len;i++){//因?yàn)榈谝淮尾挥茫詮?開始
            insertNum=a[i];
            int j=i-1;//序列元素個(gè)數(shù)
            while(j>=0&&a[j]>insertNum){//從后往前循環(huán),將大于insertNum的數(shù)向后移動(dòng)
                a[j+1]=a[j];//元素向后移動(dòng)
                j--;
            }
            a[j+1]=insertNum;//找到位置,插入當(dāng)前元素
        }
    }

2.希爾排序

針對直接插入排序的下效率問題,有人對次進(jìn)行了改進(jìn)與升級,這就是現(xiàn)在的希爾排序。希爾排序,也稱遞減增量排序算法,是插入排序的一種更高效的改進(jìn)版本。希爾排序是非穩(wěn)定排序算法。

希爾排序是基于插入排序的以下兩點(diǎn)性質(zhì)而提出改進(jìn)方法的:

插入排序在對幾乎已經(jīng)排好序的數(shù)據(jù)操作時(shí), 效率高, 即可以達(dá)到線性排序的效率

但插入排序一般來說是低效的, 因?yàn)椴迦肱判蛎看沃荒軐?shù)據(jù)移動(dòng)一位

如圖所示:

對于直接插入排序問題,數(shù)據(jù)量巨大時(shí)。

將數(shù)的個(gè)數(shù)設(shè)為n,取奇數(shù)k=n/2,將下標(biāo)差值為k的數(shù)分為一組,構(gòu)成有序序列。

再取k=k/2 ,將下標(biāo)差值為k的書分為一組,構(gòu)成有序序列。

重復(fù)第二步,直到k=1執(zhí)行簡單插入排序。

代碼實(shí)現(xiàn):

首先確定分的組數(shù)。

然后對組中元素進(jìn)行插入排序。

然后將length/2,重復(fù)1,2步,直到length=0為止。

public void sheelSort(int [] a){
        int len=a.length;//單獨(dú)把數(shù)組長度拿出來,提高效率
        while(len!=0){
            len=len/2;
            for(int i=0;i<len;i++){//分組
                for(int j=i+len;j<a.length;j+=len){//元素從第二個(gè)開始
                    int k=j-len;//k為有序序列最后一位的位數(shù)
                    int temp=a[j];//要插入的元素
                    /*for(;k>=0&&temp<a[k];k-=len){
                        a[k+len]=a[k];
                    }*/
                    while(k>=0&&temp<a[k]){//從后往前遍歷
                        a[k+len]=a[k];
                        k-=len;//向后移動(dòng)len位
                    }
                    a[k+len]=temp;
                }
            }
        }
    }

3.簡單選擇排序

常用于取序列中最大最小的幾個(gè)數(shù)時(shí)。

(如果每次比較都交換,那么就是交換排序;如果每次比較完一個(gè)循環(huán)再交換,就是簡單選擇排序。)

遍歷整個(gè)序列,將最小的數(shù)放在最前面。

遍歷剩下的序列,將最小的數(shù)放在最前面。

重復(fù)第二步,直到只剩下一個(gè)數(shù)。

代碼實(shí)現(xiàn):

首先確定循環(huán)次數(shù),并且記住當(dāng)前數(shù)字和當(dāng)前位置。

將當(dāng)前位置后面所有的數(shù)與當(dāng)前數(shù)字進(jìn)行對比,小數(shù)賦值給key,并記住小數(shù)的位置。

比對完成后,將最小的值與第一個(gè)數(shù)的值交換。

重復(fù)2、3步。

public void selectSort(int[]a){
        int len=a.length;
        for(int i=0;i<len;i++){//循環(huán)次數(shù)
            int value=a[i];
            int position=i;
            for(int j=i+1;j<len;j++){//找到最小的值和位置
                if(a[j]<value){
                    value=a[j];
                    position=j;
                }
            }
            a[position]=a[i];//進(jìn)行交換
            a[i]=value;
        }
    }

4.堆排序

對簡單選擇排序的優(yōu)化。

將序列構(gòu)建成大頂堆。

將根節(jié)點(diǎn)與最后一個(gè)節(jié)點(diǎn)交換,然后斷開最后一個(gè)節(jié)點(diǎn)。

重復(fù)第一、二步,直到所有節(jié)點(diǎn)斷開。

代碼如下:

public  void heapSort(int[] a){
           int len=a.length;
           //循環(huán)建堆
           for(int i=0;i<len-1;i++){
               //建堆
               buildMaxHeap(a,len-1-i);
               //交換堆頂和最后一個(gè)元素
               swap(a,0,len-1-i);
           }
       }
        //交換方法
       private  void swap(int[] data, int i, int j) {
           int tmp=data[i];
           data[i]=data[j];
           data[j]=tmp;
       }
       //對data數(shù)組從0到lastIndex建大頂堆
       private void buildMaxHeap(int[] data, int lastIndex) {
           //從lastIndex處節(jié)點(diǎn)(最后一個(gè)節(jié)點(diǎn))的父節(jié)點(diǎn)開始
           for(int i=(lastIndex-1)/2;i>=0;i--){
               //k保存正在判斷的節(jié)點(diǎn)
               int k=i;
               //如果當(dāng)前k節(jié)點(diǎn)的子節(jié)點(diǎn)存在
               while(k*2+1<=lastIndex){
                   //k節(jié)點(diǎn)的左子節(jié)點(diǎn)的索引
                   int biggerIndex=2*k+1;
                   //如果biggerIndex小于lastIndex,即biggerIndex+1代表的k節(jié)點(diǎn)的右子節(jié)點(diǎn)存在
                   if(biggerIndex<lastIndex){
                       //若果右子節(jié)點(diǎn)的值較大
                       if(data[biggerIndex]<data[biggerIndex+1]){
                           //biggerIndex總是記錄較大子節(jié)點(diǎn)的索引
                           biggerIndex++;
                       }
                   }
                   //如果k節(jié)點(diǎn)的值小于其較大的子節(jié)點(diǎn)的值
                   if(data[k]<data[biggerIndex]){
                       //交換他們
                       swap(data,k,biggerIndex);
                       //將biggerIndex賦予k,開始while循環(huán)的下一次循環(huán),重新保證k節(jié)點(diǎn)的值大于其左右子節(jié)點(diǎn)的值
                       k=biggerIndex;
                   }else{
                       break;
                   }
               }
           }
       }

5.冒泡排序

很簡單,用到的很少,據(jù)了解,面試的時(shí)候問的比較多!

將序列中所有元素兩兩比較,將最大的放在最后面。

將剩余序列中所有元素兩兩比較,將最大的放在最后面。

重復(fù)第二步,直到只剩下一個(gè)數(shù)。

代碼實(shí)現(xiàn):

設(shè)置循環(huán)次數(shù)。

設(shè)置開始比較的位數(shù),和結(jié)束的位數(shù)。

兩兩比較,將最小的放到前面去。

重復(fù)2、3步,直到循環(huán)次數(shù)完畢。

public void bubbleSort(int []a){
           int len=a.length;
           for(int i=0;i<len;i++){
               for(int j=0;j<len-i-1;j++){//注意第二重循環(huán)的條件
                   if(a[j]>a[j+1]){
                       int temp=a[j];
                       a[j]=a[j+1];
                       a[j+1]=temp;
                   }
               }
           }
       }

6.快速排序

要求時(shí)間最快時(shí)。

選擇第一個(gè)數(shù)為p,小于p的數(shù)放在左邊,大于p的數(shù)放在右邊。

遞歸的將p左邊和右邊的數(shù)都按照第一步進(jìn)行,直到不能遞歸。

public void quickSort(int[]a,int start,int end){
           if(start<end){
               int baseNum=a[start];//選基準(zhǔn)值
               int midNum;//記錄中間值
               int i=start;
               int j=end;
               do{
                   while((a[i]<baseNum)&&i<end){
                       i++;
                   }
                   while((a[j]>baseNum)&&j>start){
                       j--;
                   }
                   if(i<=j){
                       midNum=a[i];
                       a[i]=a[j];
                       a[j]=midNum;
                       i++;
                       j--;
                   }
               }while(i<=j);
                if(start<j){
                    quickSort(a,start,j);
                }
                if(end>i){
                    quickSort(a,i,end);
                }
           }
       }

7.歸并排序

速度僅次于快速排序,內(nèi)存少的時(shí)候使用,可以進(jìn)行并行計(jì)算的時(shí)候使用。

選擇相鄰兩個(gè)數(shù)組成一個(gè)有序序列。

選擇相鄰的兩個(gè)有序序列組成一個(gè)有序序列。

重復(fù)第二步,直到全部組成一個(gè)有序序列。

public  void mergeSort(int[] a, int left, int right) {
           int t = 1;// 每組元素個(gè)數(shù)
           int size = right - left + 1;
           while (t < size) {
               int s = t;// 本次循環(huán)每組元素個(gè)數(shù)
               t = 2 * s;
               int i = left;
               while (i + (t - 1) < size) {
                   merge(a, i, i + (s - 1), i + (t - 1));
                   i += t;
               }
               if (i + (s - 1) < right)
                   merge(a, i, i + (s - 1), right);
           }
        }
        private static void merge(int[] data, int p, int q, int r) {
           int[] B = new int[data.length];
           int s = p;
           int t = q + 1;
           int k = p;
           while (s <= q && t <= r) {
               if (data[s] <= data[t]) {
                   B[k] = data[s];
                   s++;
               } else {
                   B[k] = data[t];
                   t++;
               }
               k++;
           }
           if (s == q + 1)
               B[k++] = data[t++];
           else
               B[k++] = data[s++];
           for (int i = p; i <= r; i++)
               data[i] = B[i];
        }

8.基數(shù)排序

用于大量數(shù),很長的數(shù)進(jìn)行排序時(shí)。

將所有的數(shù)的個(gè)位數(shù)取出,按照個(gè)位數(shù)進(jìn)行排序,構(gòu)成一個(gè)序列。

將新構(gòu)成的所有的數(shù)的十位數(shù)取出,按照十位數(shù)進(jìn)行排序,構(gòu)成一個(gè)序列。

代碼實(shí)現(xiàn):

public void baseSort(int[] a) {
               //首先確定排序的趟數(shù);
               int max = a[0];
               for (int i = 1; i < a.length; i++) {
                   if (a[i] > max) {
                       max = a[i];
                   }
               }
               int time = 0;
               //判斷位數(shù);
               while (max > 0) {
                   max /= 10;
                   time++;
               }
               //建立10個(gè)隊(duì)列;
               List<ArrayList<Integer>> queue = new ArrayList<ArrayList<Integer>>();
               for (int i = 0; i < 10; i++) {
                   ArrayList<Integer> queue1 = new ArrayList<Integer>();
                   queue.add(queue1);
               }
               //進(jìn)行time次分配和收集;
               for (int i = 0; i < time; i++) {
                   //分配數(shù)組元素;
                   for (int j = 0; j < a.length; j++) {
                       //得到數(shù)字的第time+1位數(shù);
                       int x = a[j] % (int) Math.pow(10, i + 1) / (int) Math.pow(10, i);
                       ArrayList<Integer> queue2 = queue.get(x);
                       queue2.add(a[j]);
                       queue.set(x, queue2);
                   }
                   int count = 0;//元素計(jì)數(shù)器;
                   //收集隊(duì)列元素;
                   for (int k = 0; k < 10; k++) {
                       while (queue.get(k).size() > 0) {
                           ArrayList<Integer> queue3 = queue.get(k);
                           a[count] = queue3.get(0);
                           queue3.remove(0);
                           count++;
                       }
                   }
               }
        }

 

提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 成人免费一级片 | 欧美另类交视频 | 欧美曰韩一区二区三区 | 国产亚洲天堂 | 国产欧美日韩精品一区二区三区 | 亚洲视屏一区 | 欧美一级爱爱 | 一区二区视频在线观看免费的 | 青青青爽国产在线视频 | 久久久久日韩精品无 | 成人午夜视频免费看欧美 | 日韩一区二区不卡中文字幕 | 日本四虎影院 | 尤物视频在线观看 | 伊人网综合在线观看 | 精品久久一区二区 | 四虎影视永久地址 | 在线亚洲欧美日韩 | 国产91在线 | 亚洲 | 91福利社在线观看 | 亚洲 在线播放 | 免费观看日本特色做爰视频在线 | 特级毛片网站 | 99国产精品久久久久久久成人热 | 日韩一区二区三区四区 | 国产夫妻久久线观看 | 超级97碰碰碰碰久久久久最新 | 国产在线观看a | 午夜毛毛片 | 人人干人人草 | 四虎影片国产精品8848 | 99热这就是里面只有精品 | 69毛片| 久久精品中文字幕第一页 | 伊人涩涩 | 日本不卡免费一区 | 亚洲特级毛片 | 久久99精品久久久久久首页 | 亚洲第一永久色 | 久久99热精品这里久久精品 | 亚洲午夜片子大全精品 |