常见排序算法Java小结

来源:互联网 发布:养老统筹怎么算法 编辑:程序博客网 时间:2024/05/16 01:08
 原想将一些常见排序算法做个小的Android demo,以供偶尔查看,后来发觉不太必要,故只记录一些核心算法,以便查找。ps:此处均默认排序从小到大,序列不为空。

1、选择排序

 //1 选择排序    public void select(int [] nums){        int size = nums.length;        int temp;        int k;        for (int i = 0;i < size - 1;i++){            k = 0;            for ( int j = 1 ; j < size - 1 -i ;j++){                if (nums[j] >  nums[k] ){                    k = j;                }            }            temp = nums[size - 1 -i];            nums[size - 1 -i] = nums[k];            nums[k] = temp;        }    }

2、冒泡排序

  //2 冒泡排序    public void bubble(int [] nums){        int size = nums.length;        int temp;        for (int i = 0;i< size - 1;i++){            for (int j = 0 ; j < size - 1 - i ;j++){                if (nums[j] > nums [j + 1]){                   temp = nums[j+1];                    nums[j+1] = nums[j];                    nums[j] = temp;                }            }        }    }

3、直接插入排序

     //3 插入排序    public void insert(int [] nums){        int size = nums.length;        int temp;        int j ;        for (int i = 0;i<size ;i++){            temp = nums[i];            for ( j = i; j > 0 && nums[j - 1] >temp ; j--){                nums[j] = nums[j-1];            }            nums[j] = temp;        }    }

4、希尔排序

  //4 希尔排序    public void shell(int[] nums){        int size = nums.length;        int temp;        int j;        for (int dicrement = size/2 ;dicrement > 0 ; dicrement /= 2){            for (int i = dicrement;i < size ;i++){                    temp = nums[dicrement];                for ( j = i ; j >= dicrement;j -= dicrement){                    if (nums[j - dicrement] > temp){                        nums[j] = nums[j - dicrement];                    }else {                        break;                    }                }                nums[j] = temp;            }        }    }

5、快速排序

 //5 快速排序    public int getMiddle(int []nums , int low , int high){        int temp = nums[low];        while (low < high){            while (low<high && nums[high] > temp ){                high--;            }            nums[low] = nums[high];            while (low<high && nums[low] < temp) {                low ++;            }            nums[high] = nums[low];        }        nums[low] = temp;        return low;    }    public void quick(int []nums , int low , int high){        if (low < high){            int middle = getMiddle(nums,low,high);            quick(nums,low,middle-1);            quick(nums,middle+1,high);        }    }    public void sort(int []nums){        if (nums.length > 0){            quick(nums,0,nums.length - 1);        }    }

在此补充一个二分查找算法,二分查找法前提序列有序,折半查找

  public int binary(int [] nums,int x){        int low = 0;        int high = nums.length - 1;        while (low <= high){            int middle = (low + high)/2 ;            if (x == nums[middle])                return middle;            else if (x > nums[middle])                low = middle+ 1;            else                high = middle - 1;        }        return  -1;    }
0 0