• 排序算法——插入排序


    递归算法切记切记退出的条件,比如快速排序中的

    if (start >= end)
    return;

    常见排序算法的复杂度:

    插入排序,实际上是子序列依次向完整序列的增长过程,每次增长主要任务就是为哨兵(新增加的元素)寻找位置!

    package com.pt;
    
    import static org.junit.Assert.*;
    
    import org.junit.Test;
    
    public class ArraySort {
        int[] array = {10,2,4,9,56,5,43,1,65,13,15,9};
        
        //插入排序
        @Test
        public void InsertSort() {
            int i=1;    
            for (i=1; i < array.length; i++) {
                int key = array[i];
                int j=i;
                while(j>0&&key<array[j-1]){
                    array[j]=array[j-1];
                    j--;
                }
                array[j] = key;
                printArray(array);
                System.out.println();
            }
            
        }
        
        public void printArray(int[] a){
            int i = a.length;
            while (i>0) {
                i--;
                System.out.print(a[i] + ", ");
            }
        }
    
    }

    快速排序:

    快速排序的核心思想是分区而治

    import static org.junit.Assert.*;
    
    import org.junit.Test;
    
    
    public class SortOperator {
    
    
        public void quickSort(int[] inIntegers,int startLoc,int endLoc) {
            if(startLoc >= endLoc)
                return;
            int initStart = startLoc;
            int initEnd = endLoc;
            int key = inIntegers[startLoc];
            while(startLoc < endLoc){
                while(startLoc < endLoc && inIntegers[endLoc] >= key){
                    endLoc--;
                }
                inIntegers[startLoc] = inIntegers[endLoc];
                
                while(startLoc < endLoc && inIntegers[startLoc] <= key){
                    startLoc++;
                }
                
                inIntegers[endLoc] = inIntegers[startLoc];
            }
            inIntegers[startLoc] = key;
            quickSort(inIntegers, initStart, startLoc);
            quickSort(inIntegers, startLoc+1, initEnd);
            
        }
        
        @Test
        public void test(){
            int[] array = {10,2,4,9,56,5,43,1,65,13,15,99,15};
            quickSort(array,0,12);
            printArray(array);
        }
        
        public void printArray(int[] a){
            int i = 0;
            while (i<a.length) {
                System.out.print(a[i] + ", ");
                i++;
            }
        }
    
    
    }

    归并排序

    package com.pt.spring.learn.bean;
    
    import java.util.Arrays;
    
    public class Sort {
        public static void main(String[] args) {
            System.out.println("----start----");
            int[] array1 = new int[]{1, 4, 5, 7, 8, 9, 12};
            int[] array2 = new int[]{1, 2, 4, 5, 7, 10, 19, 30, 32};
            System.out.println(Arrays.toString(binMergeSort(array1, array2)));
    
            int[] array = new int[]{1, 3, 2, 4, 8, 6, 5};
            sort(array);
            System.out.println(Arrays.toString(array));
        }
    
        public static void sort(int[] array) {
            int[] temp = new int[array.length];//在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间
            mergeSort(array, 0, array.length - 1, temp);
        }
    
        public static void mergeSort(int[] array, int first, int last, int[] sortArray) {
            if (first < last) {
                int mid = (first + last) / 2;
                mergeSort(array, first, mid, sortArray);
                mergeSort(array, mid + 1, last, sortArray);
                mergeSort(array, first, mid, last, sortArray);
            }
        }
    
        //多路归并排序
        public static void mergeSort(int[] arr, int left, int mid, int right, int[] temp) {
            int i = left;
            int j = mid + 1;
            int t = 0;
            while (i <= mid && j <= right) {
                if (arr[i] <= arr[j]) {
                    temp[t++] = arr[i++];
                } else {
                    temp[t++] = arr[j++];
                }
            }
    
            while (i <= mid) {
                temp[t++] = arr[i++];
            }
            while (j <= right) {
                temp[t++] = arr[j++];
            }
    
            t = 0;
            while (left <= right) {
                arr[left++] = temp[t++];
            }
        }
        //二路归并排序
        public static int[] binMergeSort(int[] array1, int[] array2) {
            int i1 = 0;
            int i2 = 0;
            int[] ret = new int[array1.length + array2.length];
            int i = 0;
            for (; i1 < array1.length && i2 < array2.length; ) {
                if (array1[i1] == array2[i2]) {
                    ret[i++] = array1[i1++];
                    ret[i++] = array1[i2++];
                } else if (array1[i1] > array2[i2]) {
                    ret[i++] = array2[i2++];
                } else if (array1[i1] < array2[i2]) {
                    ret[i++] = array1[i1++];
                }
            }
            if (i1 < array1.length) {
                while (i1 < array1.length) {
                    ret[i++] = array1[i1++];
                }
            } else if (i2 < array2.length) {
                while (i2 < array2.length) {
                    ret[i++] = array2[i2++];
                }
            }
            return ret;
        }
    }

    堆排序:

    package com.pt.spring.learn.bean;
    
    import java.util.Arrays;
    
    /**
     * 堆,特殊的完全二叉树;
     * 从0开始计数
     * 第i个节点的父节点是(i-1)/2,两个子节点是2i+1和2i+2
     * 从1开始计数
     * 第i个节点的父节点是i/2,两个子节点是2i和2i+1
     */
    public class HeapSort {
        public static void main(String[] args) {
            int[] array = new int[]{1, 7, 3, 9, 2, 98, 4, 39, 25, 10, 44, 43};
            swap(array, 2, 5);
            System.out.println(Arrays.toString(array));
            heapSort(array);
            System.out.println(Arrays.toString(array));
        }
    
        public static void heapSort(int[] array) {
            for (int i = array.length; i > 0; i--) {
                makeHeap(array, i);
                swap(array, 0, i - 1);
            }
        }
    
        /***
         * 调整array 使得前n个元素构成大顶堆(从1开始计数)
         * 借助adjustHeap方法,自下而上调整,自右向左
         * @param array
         * @param n
         */
        public static void makeHeap(int[] array, int n) {
            for (int i = n / 2 - 1; i >= 0; i--) {
                adjustHeap(array, i, n);
            }
        }
    
        /**
         * 调整第i个节点及其子节点,使得以i为根节点的树是一个大顶堆
    * 但对于堆排序来说,只需要使得第i个节点的位置是最大值(或最小值)即可,所以如果仅用于排序,此函数还有优化空间
    * len的作用是只关注前len个元素 * *
    @param array * @param i * @param len */ public static void adjustHeap(int[] array, int i, int len) { int maxChild = i * 2 + 1;//假设左节点是父子中值最大的 while (maxChild < len) { //首先取出两个子节点最大的节点 if (maxChild + 1 < len && array[maxChild + 1] > array[maxChild]) { maxChild++; } //比较最大子节点与父节点的大小 if (array[i] > array[maxChild]) { break; } else { swap(array, i, maxChild); i = maxChild; maxChild = i * 2 + 1; } } } public static void swap(int[] array, int i, int j) { int temp = array[i]; array[i] = array[j]; array[j] = temp; } }
  • 相关阅读:
    windows phone中三种解析XML的方法
    windows phone因为墓碑化导致“正在恢复”的分析
    windows phone之获取当前连接WIFI的SSID
    在wp中,使用NavigationService.Navigate导航页面出现错误
    数据结构之单链表,c#实现
    数据结构之顺序表,c#实现
    优化C#程序的48种方法
    一次js代码修改不更新问题的解决
    Java与Unicode
    JAVA中线程同步的方法
  • 原文地址:https://www.cnblogs.com/tengpan-cn/p/5943750.html
Copyright © 2020-2023  润新知