Android 面试之排序算法

2016-12-10  本文已影响0人  eddy_wiki

本文出自 Eddy Wiki ,转载请注明出处:http://eddy.wiki/interview-algorithm.html

本文收集整理了排序、查找算法相关的知识。

排序算法参考

排序算法过程演示动画

九大基础排序总结和对比

各种排序算法的分析及java实现

选择排序

public void sort(int[] args) 
{
        int len = args.length;
        for (int i = 0,k = 0; i < len; i++,k = i) {
            // 在这一层循环中找最小
            for (int j = i + 1; j < len; j++) {
                // 如果后面的元素比前面的小,那么就交换下标,每一趟都会选择出来一个最小值的下标
                if (args[k] > args[j]) k = j;
            }

            if (i != k) {
                int tmp = args[i];
                args[i] = args[k];
                args[k] = tmp;
            }
        }
    }

冒泡排序

public void sort(int[] args) 
        {
            //第一层循环从数组的最后往前遍历
            for (int i = args.length - 1; i > 0 ; --i) {
                //这里循环的上界是 i - 1,在这里体现出 “将每一趟排序选出来的最大的数从sorted中移除”
                for (int j = 0; j < i; j++) {
                    //保证在相邻的两个数中比较选出最大的并且进行交换(冒泡过程)
                    if (args[j] > args[j+1]) {
                        int temp = args[j];
                        args[j] = args[j+1];
                        args[j+1] = temp;
                    }
                }
            }
        }

快速排序

        public int dividerAndChange(int[] args, int start, int end) 
        {   
            //标准值
            int pivot = args[start];
            while (start < end) {
                // 从右向左寻找,一直找到比参照值还小的数值,进行替换
                // 这里要注意,循环条件必须是 当后面的数 小于 参照值的时候
                // 我们才跳出这一层循环
                while (start < end && args[end] >= pivot)
                    end--;

                if (start < end) {
                    swap(args, start, end);
                    start++;
                }

                // 从左向右寻找,一直找到比参照值还大的数组,进行替换
                while (start < end && args[start] < pivot)
                    start++;

                if (start < end) {
                    swap(args, end, start);
                    end--;
                }
            }

            args[start] = pivot;
            return start;
        }

        public void sort(int[] args, int start, int end) 
        {
            //当分治的元素大于1个的时候,才有意义
            if ( end - start > 1) {
                int mid = 0;
                mid = dividerAndChange(args, start, end);
                // 对左部分排序
                sort(args, start, mid);
                // 对右部分排序
                sort(args, mid + 1, end);
            }
        }

        private void swap(int[] args, int fromIndex, int toIndex) 
        {
            args[fromIndex] = args[toIndex];
        }

归并排序

折半查找

基本原理:每次查找都对半分,但要求数组是有序的

public class Solution {

    public static int BinarySearch(int[] sz,int key){
        int low = 0;
        int high = sz.length - 1;

        while (low <= high) {
            int middle = (low + high) / 2;
            if(sz[middle] == key){
                return middle;
            }else if(sz[middle] > key){
                high = middle - 1;
            }else {
                low = middle + 1;
            }
        }
        return -1;
    }
}
上一篇下一篇

猜你喜欢

热点阅读