各种排序

1.快速排序

(1)基本思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。
(2)实例:
这里写图片描述
(3)用java实现

void quick_sort(int s[], int l, int r)  
    {  
        if (l < r)  
        {  
            //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1  
            int i = l, j = r, x = s[l];  
            while (i < j)  
            {  
                while(i < j && s[j] >= x) // 从右向左找第一个小于x的数  
                    j--;    
                if(i < j)   
                    s[i++] = s[j];  

                while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数  
                    i++;    
                if(i < j)   
                    s[j--] = s[i];  
            }  
            s[i] = x;  
            quick_sort(s, l, i - 1); // 递归调用   
            quick_sort(s, i + 1, r);  
        }  
    }  

2.直接插入排序

//插入排序,假设第n个数之前的数都已经排好序了,对第n个数进行排序时会跟前面的数进行比较,
    //将比这个数大的数都整体往后移动一个位置
    public static void main(String[] args) {
        int a[]={49,38,65,97,76,13,27,49,78,34};  

        int temp=0;
        for (int i = 1; i < a.length; i++) {
            int j=i-1;
            temp=a[i];
            for(;j >= 0 && a[j] > temp;j--){
                a[j+1]=a[j];
            }
            a[j+1]=temp;
        }

        for(int i=0;i<a.length;i++)  

           System.out.println(a[i]);  

    }

3.希尔排序(最小增量排序)

//算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,
    //然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。以此类推直到增量减到1时,进行直接插入排序后,跳出循环排序完成。
    public static void main(String[] args) {
        int a[]={49,38,65,97,76,13,27,49,78,34};  
        double d=a.length;
        while(true){
            d=Math.ceil(d/2);
            int d1=(int)d;
            int temp=0;
            for (int i = 1; i < a.length; i+=d1) {
                int j=i-d1;
                temp=a[i];
                for(;j>=0&&a[j]>temp;j-=d1){
                    a[j+d1]=a[j];
                }
                a[j+d1]=temp;
            }
            if(d1==1){
                break;
            }
        }  

        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }

    }

4.简单选择排序

//在数组中选出最小的放在数组第一个,接着选出第二小的放在第二个,以此类推进行排序
    public static void main(String[] args) {
        int a[]={49,38,65,97,76,13,27,49,78,34};  
        for (int i = 0; i < a.length; i++) {
            int j=i+1;
            int temp=a[i];
            int position = i;
            for(;j<a.length;j++){
                if(a[j]<a[i]){
                    a[i]=a[j];
                    position=j;
                }
            }
            a[position]=temp;
        } 

        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }

    }

5.冒泡排序

//在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,
    //让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
    public static void main(String[] args) {
        int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51}; 
         int temp=0; 
         for(int i=0;i<a.length-1;i++){ 
         for(int j=0;j<a.length-1-i;j++){ 
          if(a[j]>a[j+1]){ 
          temp=a[j]; 
          a[j]=a[j+1]; 
          a[j+1]=temp; 
          } 
         } 
         } 

         for(int i=0;i<a.length;i++){ 
         System.out.println(a[i]); 
         } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章