韓順平 java 第十七講 排序

內部排序 vs 外部排序

  • 內部排序:將需要處理的所有數據都加載到內存中進行排序。包括(交換式排序、選擇式排序和插入式排序)
  • 外部排序:數據量過大,無法全部加載到內存中,需要藉助外部存儲進行排序,包括(合併排序法和直接合並排序法)。
  • 排序是數據處理中很重要的運算,一般數據處理工作25%的時間都在進行排序。

交換式排序

屬於內部排序法,是運用數據值比較後,根據判斷規則對數據位置進行交換,以達到排序的目的。分兩種:冒泡排序(Bubble sort)和快速排序(Quick sort)

仔細看看這個算法哪裏出錯了:

        for(int i = 1;i <= a.length;++i){
            for(int j = 0;j < a.length-i-1;++j){
//          每次都找出最大的放在未排序的後面
                if(a[j] > a[a.length-i]){
                    int temp = a[j];
                    a[j] = a[a.length-i];
                    a[a.length-i]=temp;
                }
            }
        }

這個算法意圖是每次找到最大的值放到未排序的末尾
但是,首先分析一下,外層循環是控制循環次數,也就是length次。
但是內層,循環多少次?
當i =1,內層循環從0 到 a.length -2 ,也就是a.length -1 次。
當i = a.length-2 時,內層循環1次。
當i = a.length-1 時,內層循環0次。
當i = a.length時,內層循環0次。
所以這個排序算法雖然能正確的排序,但是,循環有冗餘

冒泡排序

        for(int i = 0;i < a.length;++i){
            for(int j = 0;j < a.length-i-1;++j){
                //每次比較相鄰的兩個數,大的放在後面,也就是冒泡
                if(a[j] > a[j+1]){
                    int temp = a[j];
                    a[j] = a[j+1];
                    a[j+1]=temp;
                }
            }
        }

選擇排序

        for(int i=0; i<v.length; i++){
                int min = v[i]; 
                int temp;
                int index = i;
                for(int j=i+1;j<v.length;j++){
                    if(v[j] < min){ 
                        min = v[j]; 
                        index = j;
                    }       
                }      
                temp = v[i]; 
                v[i] = min;
                v[index]= temp;
        }

插入排序

屬於內部排序法,是對於欲排序的元素以插入的方式找尋該元素的適當位置,以打倒排序的目的。
插入排序又分爲插入排序法、謝爾排序法、二叉樹排序法


查找

分爲順序查找和二分查找

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章