码迷,mamicode.com
首页 > 编程语言 > 详细

排序、查找算法

时间:2017-04-17 23:50:05      阅读:390      评论:0      收藏:0      [点我收藏+]

标签:参考   int   select   插入排序   img   article   com   复杂度   序列   

技术分享

1> 插入排序

//插入排序(把第一个当作也排好序,然后对后面的依次插入到已排好序的队列中)平均时间复杂度0(n^2)
    public void insertSort(int[] a){
        for(int i = 1;i<a.length;i++){
            for(int j = i;j > 0;j--){
                if(a[j] < a[j-1]){
                    int tmp = a[j];
                    a[j] = a[j-1];
                    a[j-1] = tmp;
                }
            }
        }
    }

2> 希尔排序

/*希尔排序:平均时间复杂度O(n^2)
    先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,
    然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,
    再对全体元素进行一次直接插入排序*/
    public void shellSort(int[] a){
        int i,j,gap,tmp,k;
        int n = a.length;
        for(gap = n/2;gap > 0;gap /=2){ //分组,直到增量足够小
            for(i = 0;i<gap;i++){
                
                for(j = i + gap;j < n;j += gap){
                    if (a[j] < a[j - gap]){  
                       tmp = a[j];  
                       k = j - gap;  
                       while (k >= 0 && a[k] > tmp)  
                        {  
                            a[k + gap] = a[k];  
                            k -= gap;  
                        }  
                        a[k + gap] = tmp;  
                    }
                }
            }
        }
    }

3> 冒泡排序

 //冒泡排序:将第i个元素,进行n遍比较,移到最后;平均时间复杂度:O(n^2);
    public void bubbleSort(int[] a){
        int n = a.length;
        for(int i = 0;i<n;i++){
            for(int j = 0;j < n -i-1;j++){
                if(a[j] > a[j + 1]){
                    int tmp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = tmp;
                }
            }
        }
    }

4> 选择排序

/*选择排序:
    在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;
    然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,
    依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。
    */
    public void selectSort(int[] a){
        int index,tmp;
        int n = a.length;
        for(int i = 0;i<n-1;i++){
            index = i;
            for(int j=i+1;j<n;j++){
                if(a[j] < a[index]){
                    index = j;
                }
            }
            tmp = a[i];
            a[i] = a[index];
            a[index] = tmp;
        }
    }

5> 快速排序

/*快速排序:平均时间复杂度:O(N*logN).
    1.先从数列中取出一个数作为基准数。
    2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
    3.再对左右区间重复第二步,直到各区间只有一个数。
    */
    void fastSort(int[] a, int left, int right){  
    if (left < right)  
    {    
        int low = left, height = right, x = a[left];  
        while (low < height)  
        {  
            while(low < height && a[height] >= x) // 从右向左找第一个小于x的数  
                height--;
            a[low] = a[height];
              
            while(low < height && a[low] < x) // 从左向右找第一个大于等于x的数  
                low++;    
            //if(i < j)   
                //s[j--] = s[i];
            a[height] = a[low];
        }  
        a[low] = x;
        fastSort(a, low, low - 1); // 递归调用   
        fastSort(a, low + 1, right);  
    }

排序算法参考:http://blog.csdn.net/happy_wu/article/details/51841244

查找算法:

1>顺序查找

 public int find(int[] a ,int x){
        for(int i=0;i<a.length;i++){
            if(a[i] == x){
                return i;
            }
        }
        return -1;
    }

2> 二分查找

//二分查找,前提为有序。
    public int binaryFind(int[] a ,int x){
        int begin = 0;
        int end = a.length;
        while(begin < end){
            int middle = (begin + end)/2;
            if(a[middle] == x){
                return middle;
            }
            if(a[middle] < x){
                begin = middle + 1;
            }
            if(a[middle] > x){
                begin = middle - 1;
            }
        }
        return -1;
    }

 

排序、查找算法

标签:参考   int   select   插入排序   img   article   com   复杂度   序列   

原文地址:http://www.cnblogs.com/xiaozhuazheng/p/6725595.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!