zoukankan      html  css  js  c++  java
  • 排序

    public class Sort {
        /**
         * @param data
         * 冒泡排序  比较接近选择排序,不同的是冒泡排序一直在交换,而选择排序是不断比较,
         * 直到确定正确的下标一次交换完成
         */
        public void bubble_sort(int[] data) {
            int temp;
            for(int i=0; i<data.length; i++){
                //内层循环从后向前,找到最小值.循环终止时,最小值处于i位置
                for (int j=data.length-1; j>i; j--){
                    if(data[j]<data[j-1]){
                        temp = data[j-1];
                        data[j-1] = data[j];
                        data[j] = temp;
                    }
                }
            }        
        }
        
    
        
        /**
         * 插入排序  固定元素找位置
         * @param data 手中有data.length张牌,从第二张牌开始直到最后一张牌
         * 插入前面已经排好序的牌中,程序中的j起到遍历之前已排好序的牌的作用
         */
        public void insert_sort(int[] data) {
            int key,j;
            for(int i=1; i<data.length; i++){
                key = data[i];
                j= i-1;
                //key相当于data[j+1],因为0~j数据都是有序的,key只要比j大
                //则比0~j都要大
                while(j>=0 && key<data[j]){
                    data[j+1] = data[j];//可以理解为元素向后移动
                    j--;
                }            
                data[j+1] = key;
            }    
        }
    
        
        /**
         * 选择排序 固定位置找元素
         * @param data
         */
        public void selection_sort(int[] data) {
            int smallest,temp;
            for(int i=0; i<data.length-1; i++){
                smallest = i;
                for(int j=i+1; j<data.length; j++){
                    if(data[j] < data[smallest]){
                        smallest = j;
                    }
                }
                
                temp = data[i];
                data[i] = data[smallest];
                data[smallest] = temp;
            }        
        }
        
        
        /**归并排序
         * @param data
         */
        public void  merge_sort(int[] data){
            merge_sort(data, 0, data.length-1);
        }    
        private void merge_sort(int[] data, int p, int r) {
            //这段代码可这样理解:
            //一个大数组传入,被分成两半,两半数组分别传入
            //再又被分成两半,直到每一半只有一个元素
            //然后开始合并        
            if(p<r){
                int q = (p+r)/2;
                merge_sort(data,p,q);
                merge_sort(data,q+1,r);
                merge(data,p,q,r);
            }
        }
        private void merge(int[] data, int p, int q, int r) {
            
            //新建数组L,R
            //L保存原数组p~q元素
            //R保存原数组q+1~r元素
            int L[] = new int[q-p+1];
            int R[] = new int[r-q];
            System.arraycopy(data, p, L, 0, L.length);
            System.arraycopy(data, q+1, R, 0, R.length);
            
            //变量k的作用在于将原数组p~r位置的元素按从小到大顺序重排
            //i,j分别用来遍历左右数组
            int i=0;
            int j=0;
            int k;
            for(k=p; k<=r; k++){
                if(L[i]<=R[j]){
                    data[k] = L[i];
                    i++;
                    //数组到头,循环结束
                    if(i==L.length){
                       break;
                    }
                }else{
                    data[k] = R[j];
                    j++;
                    if(j==R.length){
                        break;
                    }
                }
            }
            //当某个数组遍历完,考虑到两个子数组都是有序的
            //只需要将另外一个数组的剩余值全部复制到原数组
            //上面循环退出时,k位置已经被赋值,所以是++k
            //另一个数组的赋值却未能执行,所以是i(j)++
            while(i<L.length){
                data[++k] = L[i++];
            }
            while(j<R.length){
                data[++k] = R[j++];
            }
            
        }
    
    
        
        /**
         * 快速排序
         * @param data
         */
        public void quick_sort(int[] data){
            quick_sort(data, 0, data.length-1);
        }
        private void quick_sort(int[] a, int p, int r){
            if(p < r){
                int q = partition(a, p, r);
                quick_sort(a,p,q-1);
                quick_sort(a,q+1,r);
            }        
        }
        /**
         * @return  
         */
        private int partition(int[] a, int p, int r){
            int i = p-1;
            int x= a[r];
            int temp;
            //选最后一个数字作为比较对象,方便for循环书写,中间没有被隔断
            for (int j = p ; j<r; j++){
                if(a[j] <= x){
                    i = i+1;
                    temp = a[i];
                    a[i] = a[j];
                    a[j] = temp;
                }
            }
            temp = a[i+1];
            a[i+1] = a[r];
            a[r]  = temp;
            return i+1;
            //j用来遍历数组,i用来标记将要发生交换的位置
        }
        
    
    }
  • 相关阅读:
    algorithm 使用经验
    Overload, Override and Overwrite ( copy)
    stl sort使用经验
    list 删除制定元素
    php常用技巧
    php 日历源码
    stl smart指针
    一道华为笔试题 ,内存相关
    stl list使用。(转)
    List 使用经验
  • 原文地址:https://www.cnblogs.com/hixin/p/4783669.html
Copyright © 2011-2022 走看看