各種排序

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]); 
         } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章