常用算法复习

package suanfa;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Maopao {
    public static void main(String[] args) {
        int a[] = { 6, 5, 2 ,29,9,567};
        // charu(a);
        // guibinpaixu(a, 0, 2, new int [3]);
        //kuaisupaixu(a, 0, 2);
        sort(a);
        System.out.print(a[0]);
        System.out.print(a[1]);
        System.out.print(a[2]);
        System.out.print(a[3]);
        System.out.print(a[4]);
        System.out.print(a[5]);
    }

    // 基数排序 将全部数统一位数,然后按个位、十位等等排序并放在相应位置上(数组加列表);位数次循环后数组有序
    public static void sort(int[] array) {
        // 首先确定排序的趟数;
        int max = array[0];
        for (int i = 1; i < array.length; i++) {
            if (array[i] > max) {
                max = array[i];
            }
        }
        int time = 0;
        // 判断位数;
        while (max > 0) {
            max /= 10;
            time++;
        }
        // 建立10个队列;
        List<ArrayList> queue = new ArrayList<ArrayList>();
        for (int i = 0; i < 10; i++) {
            ArrayList<Integer> queue1 = new ArrayList<Integer>();
            queue.add(queue1);
        }
        // 进行time次分配和收集;
        for (int i = 0; i < time; i++) {
            // 分配数组元素;
            for (int j = 0; j < array.length; j++) {
                // 得到数字的第time+1位数;
                int x = array[j] % (int) Math.pow(10, i + 1) / (int) Math.pow(10, i);
                ArrayList<Integer> queue2 = queue.get(x);
                queue2.add(array[j]);
                queue.set(x, queue2);
            }
            int count = 0;// 元素计数器;
            // 收集队列元素;
            for (int k = 0; k < 10; k++) {
                while (queue.get(k).size() > 0) {
                    ArrayList<Integer> queue3 = queue.get(k);
                    array[count] = queue3.get(0);
                    queue3.remove(0);
                    count++;
                }
            }
        }
    }
    //冒泡排序 从第一个数开始,两两比较并交换位置,第一次选出最大数,第二次选出二大数;循环(n-1)*(n-2)...次后数组有序
    public static int[] maopaopaixu(int[] array) {
        for (int i = 0; i < array.length - 1; i++) {
            for (int j = 0; j < array.length - 1 - i; j++) {
                if (array[j] > array[j + 1]) {
                    int temp = array[j + 1];
                    array[j + 1] = array[j];
                    array[j] = temp;
                }
            }
        }
        return null;
    }
    //归并排序 将数组分成两个数组,将两个数组再分成四个数组,直到单个数,两两排序
    public static int[] guibinpaixu(int[] array, int first, int last, int temp[]) {
        if (first < last) {
            int mid = (first + last) / 2;
            guibinpaixu(array, first, mid, temp);
            guibinpaixu(array, mid + 1, last, temp);
            guibinSort(array, first, mid, last, temp);
        }
        return null;
    }
    //归并排序 对两个有序数组进行排序
    public static void guibinSort(int[] array, int first, int mid, int last, int temp[]) {
        int i = first, j = mid + 1;
        int m = mid, n = last;
        int k = 0;
        while (i <= m && j <= n) {
            if (array[i] <= array[j]) {
                temp[k++] = array[i++];
            } else {
                temp[k++] = array[j++];
            }
        }
        while (i <= m) {
            temp[k++] = array[i++];
        }
        while (j <= n) {
            temp[k++] = array[j++];
        }
        for (int k2 = 0; k2 < k; k2++) {
            array[first + k2] = temp[k2];
        }
    }
    //快速排序 选择一个基数,将大于它的排在左,小于它的排在右,经过递归,得到有序数组
    public static int[] kuaisupaixu(int[] array, int low, int hight) {
        if (low < hight) {
            int moddle = getmiddle(array, low, hight);
            kuaisupaixu(array, low, moddle - 1);
            kuaisupaixu(array, moddle + 1, hight);
        }
        return null;
    }
    //快速排序 选基准;按基准将数组排序
    public static int getmiddle(int[] array, int low, int hight) {
        int temp = array[low];
        while (low < hight) {
            while (low < hight && array[hight] >= temp) {
                hight--;
            }
            array[low] = array[hight];
            while (low < hight && array[low] < temp) {
                low++;
            }
            array[hight] = array[low];
        }
        array[low] = temp;
        return low;
    }
    //选择排序 选择一个最小的数为基准放在第一位,第二小放在第二位,依次排序
    public static int[] xuanzepaixu(int[] array) {
        for (int i = 0; i < array.length; i++) {
            int k = i;
            for (int j = i + 1; j < array.length; j++) {
                if (array[j] < array[k]) {
                    k = j;
                }
            }
            if (i != k) {
                int temp = array[i];
                array[i] = array[k];
                array[k] = temp;
            }
        }
        return null;
    }
    //插入排序 第一个数为有序数组,从第二个数开始,与前面的数组进行比较插入排序,知道最后一个数
    public static int[] charu(int[] array) {
        int temp = 0;
        for (int i = 1; i < array.length; i++) {
            int j = i - 1;
            temp = array[i];
            for (; j >= 0 && temp < array[j]; j--) {
                array[j + 1] = array[j]; // 将大于temp的值整体后移一个单位
            }
            array[j + 1] = temp;
        }
        return null;
    }

}

posted @ 2017-11-25 22:13  Big_Monkey  阅读(177)  评论(0编辑  收藏  举报