1. 程式人生 > >冒泡,插入,選擇排序

冒泡,插入,選擇排序

    //3.2 加入二分查詢的插入排序
        private static void binaryInsertSort(int[] a) {
            //依次把每個元素拿來插入到 之前已經有序的子序列當中
            for(int i=0; i<a.length-1; i++){//趟數:n-1  ---除第1個元素,後面的每個元素都拿來插入一次
                //前面i個數已經排好序,現在是準備插入第i+1個數

                //待插入的數
                int temp = a[i+1];

                //※※利用二分演算法查詢j ---j的定義同3.1
int low=0; int high=i; int mid; while(low<=high){ //System.out.println(low+","+high); mid =(low+high)/2; if(a[mid]>temp){//左半區(所有右半區的數都會比temp大) high=mid-1
; }else{//右半區 low = mid+1; } } int j=high;//出迴圈後,high的位置即是我們想要找的j //把[j,i]部分的元素全部往後移一個位置 for(int k=i;k>j;k--){ a[k+1]=a[k]; } //讓temp坐在j+1的位置
a[j+1]=temp; } } //3.1直接插入排序 ---原序列越有序排得越快 (逆序排得最慢) private static void insertSort(int[] a) { //依次把每個元素拿來插入到 之前已經有序的子序列當中 for(int i=0; i<a.length-1; i++){//趟數:n-1 ---除第1個元素,後面的每個元素都拿來插入一次 //前面i個數已經排好序,現在是準備插入第i+1個數 //待插入的數 int temp = a[i+1]; //找到j ----temp最終是坐在j+1的位置 j的情況:或者是-1,或者是從後往前找到的第一個沒有比temp大的數 int j=i;//從第i個位置開始從後往前依次邊查詢邊移位置 while(a[j]>temp){ a[j+1] = a[j]; j--; if(j<0){ break; } } a[j+1]=temp; //讓temp坐在j+1的位置 } } //2.2 選擇排序 private static void selectSort(int[] a) { for(int i=0;i<a.length-1;i++){ //每一趟把最小的放在最前面(第i位置) int k=i; //用k記錄當前值最小的元素的位置 for(int j=i+1;j<a.length;j++){ if(a[k]>a[j]){//拿第k位置的元素去比 k=j; } } //經過前面的迴圈,得到k位置的元素是最小的,然後把它和第i的位置交換 swap(a,i,k); } } //2.1排手機---近似選擇排序 private static void selectSort0(int[] a) { for(int i=0;i<a.length-1;i++){ //每一趟把最小的放在最前面(第i位置) for(int j=i+1;j<a.length;j++){ if(a[i]>a[j]){ swap(a,i,j); } } } } //1.2優化的氣泡排序 private static void bubbleSort2(int a[]){ for(int i=0;i<a.length-1;i++){//趟數:n-1 ----n為陣列長度(元素總數) //如果存在一趟,沒有出現一次交換,那麼說明該序列已經有序,不必要再進行排了 boolean flag=false; for(int j=0;j<a.length-1-i;j++ ){ if(a[j]>a[j+1]){ swap(a,j,j+1); flag=true; } } if(flag==false){ System.out.println(i); break; } } } //1.1普通的氣泡排序 private static void bubbleSort(int a[]){ for(int i=0;i<a.length-1;i++){//趟數:n-1 ----n為陣列長度(元素總數) //每趟從第0個元素開始,依次兩兩相鄰的元素進行比較,直接到a[n-1-i]和a[n-i] for(int j=0;j<a.length-1-i;j++ ){//每趟能冒一個泡(即是當前子序列值最大的那個元素)--放在最後(第n-i位置) if(a[j]>a[j+1]){ swap(a,j,j+1); } } } } //交換a[i]和a[j] private static void swap(int[]a, int i, int j){ int temp = a[i]; a[i] = a[j]; a[j] = temp; } private static void print( int[] a){ for(int x:a){ System.out.print(x+" "); } System.out.println(); } }