03 经典排序算法实现-代码

对数器

package com.bigbear; import java.util.Arrays; import java.util.Random; /**  * 对数器  *  */ public class DataChecker {    
 public static void main(String[] args) {      
   for (int i = 0; i < 50; i++) {             check();         }     }     private static void check() {       
  int[] arr = generateRandomArray();      
   int[] arr2 = new int[arr.length];   
      System.arraycopy(arr, 0, arr2, 0, arr.length);         //java类的排序         Arrays.sort(arr);         //对arr2进行排序         //SelectionSort.sortByMinPosAndMaxPos(arr2);         //BubbleSort.sort(arr2);         //InsertionSort.sortWithoutSwap(arr2);         MergeSort.sort(arr2, 0, arr2.length - 1);         boolean same = true;         for (int i = 0; i < arr.length; i++) {             if (arr[i] != arr2[i]) {                 same = false;             }         }         System.out.println(same ? "right" : "wrong");     }     private static int[] generateRandomArray() {         //数组是对象,是引用类型         int length = 20;         int[] arr = new int[length];         for (int i = 0; i < arr.length; i++) {             Random rd = new Random();             arr[i] = rd.nextInt(length);         }         return arr;     }     static void print(int[] arr) {         System.out.println("print result:");         for (int i = 0; i < arr.length; i++) {             System.out.print(arr[i] + " ");         }         System.out.println("");     } }

选择排序


package com.bigbear; /**  * 选择排序排序  * 重复(元素个数-1)次  * 把第一个没有排序过的元素设置为最小值  * 遍历每个没有排序过的元素  * 如果元素 < 现在的最小值  * 将此元素设置成为新的最小值  * 将最小值和第一个没有排序过的位置交换  *  */ public class SelectionSort {     public static void main(String[] args) {         int[] arr = {6, 5, 2, 4, 6, 3, 1, 9, 7};         //int[] arr = {4, 1, 13, 18, 5, 19, 18, 6, 13, 0, 7, 12, 10, 3, 10, 1, 13, 3, 8, 4};         System.out.println("初始数组:");         print(arr);         sortByMinPos(arr);     }     public static void sortByMinPos(int[] arr) {         for (int beginpos = 0; beginpos < arr.length - 1; beginpos++) {             int minpos = beginpos;             for (int i = beginpos + 1; i < arr.length; i++) {                 if (arr[i] < arr[minpos]) {                     minpos = i;                 }             }             swap(arr, beginpos, minpos);             System.out.println("第" + (beginpos + 1) + "次循环的结果如下,其中minpos:" + minpos);             print(arr);         }     }     public static void sortByMinPosAndMaxPos(int[] arr) {         for (int beginpos = 0; beginpos < arr.length / 2; beginpos++) {             int minpos = beginpos;             int maxpos = arr.length - beginpos - 1;             for (int i = beginpos + 1; i < arr.length; i++) {                 if (arr[i] < arr[minpos]) {                     minpos = i;                 }                 if (arr[arr.length - i - 1] > arr[maxpos]) {                     maxpos = arr.length - i - 1;                 }             }             swap(arr, beginpos, minpos);             //当最大值等于最小值循环开始的位置,上一步的交换使开始位置的值被交换了,所以最大值的位置要跟随变动             if (maxpos == beginpos) {                 //System.out.println("maxpos:" + maxpos + "变更为:" + minpos);                 maxpos = minpos;             }             //边界处理:当最大值的位置等于最大值循环交换的位置,则不用进行交换             if (maxpos != (arr.length - beginpos - 1)) {                 swap(arr, arr.length - beginpos - 1, maxpos);             }             // System.out.println("第" + (beginpos + 1) + "次循环的结果如下,其中minpos:" + minpos + ",maxpos:" + maxpos);             // print(arr);         }     }     private static void swap(int[] arr, int i, int j) {         int temp = arr[i];         arr[i] = arr[j];         arr[j] = temp;     }     private static void print(int[] arr) {         for (int i = 0; i < arr.length; i++) {             System.out.print(arr[i] + " ");         }         System.out.println("");     } }

冒泡排序:


package com.bigbear; /**  * 冒泡排序  *  */ public class BubbleSort {     public static void main(String[] args) {         int[] arr = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 1};         System.out.println("初始数组:");         print(arr);         sort(arr);     }     public static void sort(int[] arr) {         for (int loop = 0; loop < arr.length - 1; loop++) {             for (int i = 0; i < arr.length - loop - 1; i++) {                 if (arr[i] > arr[i + 1]) {                     swap(arr, i, i + 1);                 }             }             //System.out.println("第" + (loop + 1) + "次循环的结果如下");             // print(arr);         }     }     private static void swap(int[] arr, int i, int j) {         int temp = arr[i];         arr[i] = arr[j];         arr[j] = temp;     }     private static void print(int[] arr) {         for (int i = 0; i < arr.length; i++) {             System.out.print(arr[i] + " ");         }         System.out.println("");     } }

插入排序:


package com.bigbear; /**  * 插入排序  *  */ public class InsertionSort {     public static void main(String[] args) {         int[] arr = {39,44,38,5,47,15,36,26,27,2,46,4,19,50,48};         System.out.println("初始数组:");         print(arr);         sortWithoutSwap(arr);         //sortWithSwap(arr);     }     /**      * 插入排序,采用临时变量标记插入位置,不交换      *      * @param arr      */     public static void sortWithoutSwap(int[] arr) {         for (int i = 1; i < arr.length; i++) {             int insertPos = i;             //findInsertPos             while (insertPos > 0 && arr[i] < arr[insertPos - 1]) {                 insertPos = insertPos - 1;             }             insert(arr, i, insertPos);             //print(arr);         }     }     /**      * 将移动的元素插入到最小值的位置,并移动相邻的后续元素      *      * @param arr      * @param movePos      * @param insertPos      */     private static void insert(int[] arr, int movePos, int insertPos) {         if (movePos == insertPos) {             return;         }         int temp = arr[movePos];         for (int i = movePos; i > insertPos; i--) {             arr[i] = arr[i - 1];         }         arr[insertPos] = temp;     }     /**      * 插入排序,相邻的两个数比较,符合条件交换      *      * @param arr      */     public static void sortWithSwap(int[] arr) {         for (int begin = 1; begin < arr.length; begin++) {             for (int i = begin; i > 0; i--) {                 if (arr[i] < arr[i - 1]) {                     swap(arr, i, i - 1);                 }             }             //print(arr);         }     }     private static void swap(int[] arr, int i, int j) {         int temp = arr[i];         arr[i] = arr[j];         arr[j] = temp;     }     private static void print(int[] arr) {         for (int i = 0; i < arr.length; i++) {             System.out.print(arr[i] + " ");         }         System.out.println("");     } }


归并排序:

package com.bigbear; /** * 归并排序 * */ public class MergeSort {     public static void main(String[] args) {         int[] arr = {1, 4, 7, 8, 3, 6, 9};        sort(arr, 0, arr.length - 1);        print(arr);    }     /**     * @param arr   数组     * @param left  左边界     * @param right 右边界     */    public static void sort(int[] arr, int left, int right) {         if (left == right) {             return;        }         //分成两半        int mid = (left + right) / 2;        //左边排序        sort(arr, left, mid);        //右边排序        sort(arr, mid + 1, right);        //左右合并        merge(arr, left, mid + 1, right);    }     private static void merge(int[] arr, int leftPoint, int rightPoint, int rightBound) {         int middle = rightPoint - 1;        int[] tempArr = new int[rightBound - leftPoint + 1];        int i = leftPoint;        int j = rightPoint;        int k = 0;        while (i <= middle && j <= rightBound) {             if (arr[i] <= arr[j]) {                 tempArr[k] = arr[i];                i++;            } else {                 tempArr[k] = arr[j];                j++;            }             k++;        }         while (i <= middle) {             tempArr[k++] = arr[i++];        }         while (j <= rightBound) {             tempArr[k++] = arr[j++];        }         for (int m = 0; m < tempArr.length; m++) {             arr[leftPoint + m] = tempArr[m];        }     } //    private static void merge(int[] arr) { //        int middle = arr.length / 2; //        int[] tempArr = new int[arr.length]; // //        int leftPoint = 0; //        int rightPoint = middle + 1; //        int index = 0; // // //        while (leftPoint <= middle && rightPoint < arr.length) { //            if (arr[leftPoint] <= arr[rightPoint]) { //                tempArr[index] = arr[leftPoint]; //                leftPoint++; //            } else { //                tempArr[index] = arr[rightPoint]; //                rightPoint++; //            } // //            index++; //        } // //        while (leftPoint <= middle){ //            tempArr[index++] = arr[leftPoint++]; //        } // //        while (rightPoint < arr.length){ //            tempArr[index++] = arr[rightPoint++]; //        } // // //        print(tempArr); //    }    private static void print(int[] arr) {         for (int i = 0; i < arr.length; i++) {             System.out.print(arr[i] + " ");        }         System.out.println("");    } }

快速排序:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值