Algorithm

Algorithm

1.     Source

2.     Sort

2.1 冒泡排序

2.2 选择排序

2.3 插入排序

2.4 希尔排

2.5 归并排序

2.6 快速排序

2.7 堆排序

2.8 计数排序

2.9 桶排序

2.10 基数排序

3.     search

3.1 顺序查找

3.2 二分查找

4.     Basis(待补充分治,动态规划,贪心,回溯,分支界限)

5.     参考文献

 

1.    Source

Java Version jdk1.8

 

2.    Sort

 

 

2.1 冒泡排序

冒泡排序BubbleSort 

package cn.chendongfang.algorithm.sort;

 

import java.util.Arrays;

 

public class BubbleSort  {

    public int[] sort(int[] sourceArray) throws Exception {

        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

        for (int i = 1; i < arr.length; i++) {

           boolean flag = true;

            for (int j = 0; j < arr.length - i; j++) {

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

                   swap(arr[j],arr[j + 1]);

                    flag = false;

                }

            }

            if (flag) {

                break;

            }

        }

        return arr;

    }

   

   private void swap(int a,int b){

      int tmp = a;

      a = b;

      b = tmp;

   }

}

 

2.2 选择排序

选择排序SelectionSort 

 

package cn.chendongfang.algorithm.sort;

 

import java.util.Arrays;

 

public class SelectionSort  {

   public int[] sort(int[] sourceArray) throws Exception {

      int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

 

      for (int i = 0; i < arr.length - 1; i++) {

          int min = i;

 

          for (int j = i + 1; j < arr.length; j++) {

             if (arr[j] < arr[min]) {

                min = j;

             }

          }

 

          if (i != min) {

             swap(arr[i] ,arr[min]);

          }

 

      }

      return arr;

   }

 

   private void swap(int a, int b) {

      int tmp = a;

      a = b;

      b = tmp;

   }

}

2.3 插入排序

插入排序InsertSort

 

package cn.chendongfang.algorithm.sort;

 

import java.util.Arrays;

 

public class InsertSort {

 

    public int[] sort(int[] sourceArray) throws Exception {

        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

 

        for (int i = 1; i < arr.length; i++) {

            int tmp = arr[i];

            int j = i;

            while (j > 0 && tmp < arr[j - 1]) {

                arr[j] = arr[j - 1];

                j--;

            }

 

            if (j != i) {

                arr[j] = tmp;

            }

 

        }

        return arr;

    }

}

 

2.4 希尔排序

希尔排序ShellSort

 

package cn.chendongfang.algorithm.sort;

 

import java.util.Arrays;

 

public class ShellSort {

 

   public static void shellSort(int[] sourceArray) {

      int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

 

      int length = arr.length;

      int temp;

      for (int step = length / 2; step >= 1; step /= 2) {

          for (int i = step; i < length; i++) {

             temp = arr[i];

             int j = i - step;

             while (j >= 0 && arr[j] > temp) {

                arr[j + step] = arr[j];

                j -= step;

             }

             arr[j + step] = temp;

          }

      }

   }

}

2.5 归并排序

归并排序MergeSort

package cn.chendongfang.algorithm.sort;

 

import java.util.Arrays;

 

public class MergeSort {

 

    public int[] sort(int[] sourceArray) throws Exception {

        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

 

        if (arr.length < 2) {

            return arr;

        }

        int middle = (int) Math.floor(arr.length / 2);

 

        int[] left = Arrays.copyOfRange(arr, 0, middle);

        int[] right = Arrays.copyOfRange(arr, middle, arr.length);

 

        return merge(sort(left), sort(right));

    }

 

    protected int[] merge(int[] left, int[] right) {

        int[] result = new int[left.length + right.length];

        int i = 0;

        while (left.length > 0 && right.length > 0) {

            if (left[0] <= right[0]) {

                result[i++] = left[0];

                left = Arrays.copyOfRange(left, 1, left.length);

            } else {

                result[i++] = right[0];

                right = Arrays.copyOfRange(right, 1, right.length);

            }

        }

 

        while (left.length > 0) {

            result[i++] = left[0];

            left = Arrays.copyOfRange(left, 1, left.length);

        }

 

        while (right.length > 0) {

            result[i++] = right[0];

            right = Arrays.copyOfRange(right, 1, right.length);

        }

 

        return result;

    }

 

}

 

 

2.6 快速排序

快速排序QuickSort

 

package cn.chendongfang.algorithm.sort;

 

import java.util.Arrays;

 

public class QuickSort {

 

    public int[] sort(int[] sourceArray) throws Exception {

        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

 

        return quickSort(arr, 0, arr.length - 1);

    }

 

    private int[] quickSort(int[] arr, int left, int right) {

        if (left < right) {

            int partitionIndex = partition(arr, left, right);

            quickSort(arr, left, partitionIndex - 1);

            quickSort(arr, partitionIndex + 1, right);

        }

        return arr;

    }

 

    private int partition(int[] arr, int left, int right) {

        int pivot = left;

        int index = pivot + 1;

        for (int i = index; i <= right; i++) {

            if (arr[i] < arr[pivot]) {

                swap(arr, i, index);

                index++;

            }

        }

        swap(arr, pivot, index - 1);

        return index - 1;

    }

 

    private void swap(int[] arr, int i, int j) {

        int temp = arr[i];

        arr[i] = arr[j];

        arr[j] = temp;

    }

 

}

 

2.7 堆排序

堆排序HeapSort 

package cn.chendongfang.algorithm.sort;

 

import java.util.Arrays;

 

public class HeapSort  {

 

    public int[] sort(int[] sourceArray) throws Exception {

        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

 

        int len = arr.length;

 

        buildMaxHeap(arr, len);

 

        for (int i = len - 1; i > 0; i--) {

            swap(arr, 0, i);

            len--;

            heapify(arr, 0, len);

        }

        return arr;

    }

 

    private void buildMaxHeap(int[] arr, int len) {

        for (int i = (int) Math.floor(len / 2); i >= 0; i--) {

            heapify(arr, i, len);

        }

    }

 

    private void heapify(int[] arr, int i, int len) {

        int left = 2 * i + 1;

        int right = 2 * i + 2;

        int largest = i;

 

        if (left < len && arr[left] > arr[largest]) {

            largest = left;

        }

 

        if (right < len && arr[right] > arr[largest]) {

            largest = right;

        }

 

        if (largest != i) {

            swap(arr, i, largest);

            heapify(arr, largest, len);

        }

    }

 

    private void swap(int[] arr, int i, int j) {

        int temp = arr[i];

        arr[i] = arr[j];

        arr[j] = temp;

    }

 

}

 

2.8 计数排序

计数排序CountingSort

package cn.chendongfang.algorithm.sort;

import java.util.Arrays;

public class CountingSort {

 

    public int[] sort(int[] sourceArray) throws Exception {

        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

 

        int maxValue = getMaxValue(arr);

 

        return countingSort(arr, maxValue);

    }

 

    private int[] countingSort(int[] arr, int maxValue) {

        int bucketLen = maxValue + 1;

        int[] bucket = new int[bucketLen];

 

        for (int value : arr) {

            bucket[value]++;

        }

 

        int sortedIndex = 0;

        for (int j = 0; j < bucketLen; j++) {

            while (bucket[j] > 0) {

                arr[sortedIndex++] = j;

                bucket[j]--;

            }

        }

        return arr;

    }

 

    private int getMaxValue(int[] arr) {

        int maxValue = arr[0];

        for (int value : arr) {

            if (maxValue < value) {

                maxValue = value;

            }

        }

        return maxValue;

    }

 

}

 

2.9 桶排序

桶排序BucketSort 

package cn.chendongfang.algorithm.sort;

 

import java.util.Arrays;

 

public class BucketSort  {

 

 

    public int[] sort(int[] sourceArray) throws Exception {

        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

 

        return bucketSort(arr, 5);

    }

 

    private int[] bucketSort(int[] arr, int bucketSize) throws Exception {

        if (arr.length == 0) {

            return arr;

        }

 

        int minValue = arr[0];

        int maxValue = arr[0];

        for (int value : arr) {

            if (value < minValue) {

                minValue = value;

            } else if (value > maxValue) {

                maxValue = value;

            }

        }

 

        int bucketCount = (int) Math.floor((maxValue - minValue) / bucketSize) + 1;

        int[][] buckets = new int[bucketCount][0];

 

      

        for (int i = 0; i < arr.length; i++) {

            int index = (int) Math.floor((arr[i] - minValue) / bucketSize);

            buckets[index] = arrAppend(buckets[index], arr[i]);

        }

 

        int arrIndex = 0;

        for (int[] bucket : buckets) {

            if (bucket.length <= 0) {

                continue;

            }

           

            sort(bucket);

            for (int value : bucket) {

                arr[arrIndex++] = value;

            }

        }

 

        return arr;

    }

 

    private int[] arrAppend(int[] arr, int value) {

        arr = Arrays.copyOf(arr, arr.length + 1);

        arr[arr.length - 1] = value;

        return arr;

    }

 

}

2.10 基数排序

基数排序RadixSort

package cn.chendongfang.algorithm.sort;

 

import java.util.Arrays;

 

public class RadixSort{

 

    public int[] sort(int[] sourceArray) throws Exception {

        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

 

        int maxDigit = getMaxDigit(arr);

        return radixSort(arr, maxDigit);

    }

 

 

    private int getMaxDigit(int[] arr) {

        int maxValue = getMaxValue(arr);

        return getNumLenght(maxValue);

    }

 

    private int getMaxValue(int[] arr) {

        int maxValue = arr[0];

        for (int value : arr) {

            if (maxValue < value) {

                maxValue = value;

            }

        }

        return maxValue;

    }

 

    protected int getNumLenght(long num) {

        if (num == 0) {

            return 1;

        }

        int lenght = 0;

        for (long temp = num; temp != 0; temp /= 10) {

            lenght++;

        }

        return lenght;

    }

 

    private int[] radixSort(int[] arr, int maxDigit) {

        int mod = 10;

        int dev = 1;

 

        for (int i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {

            int[][] counter = new int[mod * 2][0];

 

            for (int j = 0; j < arr.length; j++) {

                int bucket = ((arr[j] % mod) / dev) + mod;

                counter[bucket] = arrayAppend(counter[bucket], arr[j]);

            }

 

            int pos = 0;

            for (int[] bucket : counter) {

                for (int value : bucket) {

                    arr[pos++] = value;

                }

            }

        }

 

        return arr;

    }

 

 

    private int[] arrayAppend(int[] arr, int value) {

        arr = Arrays.copyOf(arr, arr.length + 1);

        arr[arr.length - 1] = value;

        return arr;

    }

}

 

3.    search

 

 

 

 

3.1 顺序查找

顺序查找BasicSearch

 

package cn.chendongfang.algorithm.search;

 

public class BasicSearch{

    public  int search(int[] arr, int number){

        for (int i = 0; i < arr.length; i++) {

            if(arr[i] == number){

                return i;

            }

        }

        return -1;

    }

}

 

3.2 二分查找

二分查找BinarySearch

 

package cn.chendongfang.algorithm.search;

 

 

public class BinarySearch {

    public  int binarySearch(int[] arr, int number){

        //1.定义两个变量记录要查找的范围

        int min = 0;

        int max = arr.length - 1;

 

        //2.利用循环不断的去找要查找的数据

        while(true){

            if(min > max){

                return -1;

            }

            //3.找到minmax的中间位置

            int mid = (min + max) / 2;

            //4.拿着mid指向的元素跟要查找的元素进行比较

            if(arr[mid] > number){

                //4.1 numbermid的左边

                //min不变,max = mid - 1

                max = mid - 1;

            }else if(arr[mid] < number){

                //4.2 numbermid的右边

                //max不变,min = mid + 1;

                min = mid + 1;

            }else{

                //4.3 numbermid指向的元素一样

                //找到了

                return mid;

            }

 

        }

    }

}

 

 

4.    Basis(待补充分治,动态规划,贪心,回溯,分支界限)

 

5.    参考文献

 

菜鸟教程

https://www.runoob.com/w3cnote/ten-sorting-algorithm.html

 

查找算法

https://blog.csdn.net/weixin_38189581/article/details/128199173