常用排序(一)

2021-07-23 19:44:17 字數 2318 閱讀 8302

排序根據元素是否完全在在記憶體中分為內部排序和外排序,內部排序指的是元素完全存放在記憶體中,外部排序是不斷在內外存3之間移動的排序

基本的排序演算法 中:直接插入排序、氣泡排序、選擇排序中時間複雜度都是n的二次方,高效排序中 :快排、堆排、歸併排序都是o(n log2 n)

起泡排序

他是從後倒著來,先比較n-1和n-2元素的大小,如果n-1元素小,就將他兩交換位置,接下倆再向前移動,比較n-2和n-3的大小,如果n-2小則繼續交換並且前移,這樣經過一輪之後就將最小的元素放在了第乙個的位置上,然後在進行下一趟排序,這個時間複雜度是n的平方,因為要每一趟比較都是n的時間單位,而要比較n-1趟

最原始的起泡排序就不附上**了,接下來就是對起泡排序進行改進,可以先增加乙個exchange的標誌,如果發生了互換就exchange=true。否則就是exchange= false,表示全部元素已經排好序了,可以終止了,這樣可以使得減去一些步驟,因為有的時候排序已經好了但是還是在進行著一趟趟的排序,但是並沒有交換元素,浪費了

void bubblesort(int v,int n)

} if(exchange == false) break; //本趟沒有逆序的,終止

}}

插入排序

當插入新的元素時,原來的是有順序的,前面的i-1個元素都是排好的,找到新元素的第i號位置後,原來後面的元素向後移動,然後把新元素插進去 ,時間複雜度是o(n*n)

插入排序中還有一種就是折半插入排序,又叫做二分法插入排序,在插入第i個元素的時候採用的是二分法查詢元素的位置,時間複雜度是o(nlog2 n),相比起來要好很多

void  binaryinsertsort(datalist& l,int low,int high)

}

希爾排序

又叫做縮小增量排序,待排序的有n個,取乙個整數作為間隔gap

void shellsort(datalist& l,int left,int right)while(j>=left && temp1)

}

這裡有幾個小的細節需要注意一下,第乙個就是,在第一次for迴圈中,i=left+gap,為什麼要設定這樣呢,因為在子串行中需要比較,出現逆序的話是需要後移的,後移的方向是從後向前這樣移動,不會沖掉資料

快速排序

又叫做分割槽排序,是使用最廣泛的排序,他執行快,使用的空間少,是一種不穩定的排序方法

他採用的是分治法,將所有元素分為兩個左右子串行,在左邊的子串行中的值都小於基準值,右邊序列的元素都大於等於基準值,然後對兩個子串行分別執行上面說的方法,直到排完,採用遞迴的方法

void quicksort(datalist& l,int left,int right)else

}

2.在劃分子串行時,不進行排序直接跳過,劃分之後整體上市已經排好序的,這樣就用插入排序

上述中if(right-left<=m),直接return,然後在快排之後在進行一遍插排,這樣之後就是排好序的序列了

void hybridsort(datalist& l,int left,int right)

快排中,基準元素選擇的好不好直接影響到排序的效率,所以改進中,選取基準元素時,在left和right還有中間位置元素middle中取中間值,並交換到right位置上

element& median(datalist& l,int left,int right)

}

這樣先是快排,接著對基本的進行插排

對於有大量重複元素,快排效率非常的低,可以實行三路劃分的方法來做,劃分為大於小於以及等於基準元素三部分,在掃瞄左子串行時把等於的放在最左邊,右子串行中等於的放在最右邊

void quicksort(datalist& l,int left,int right)

if(l[i]>l[right]) swap(l[i],l[right]);k = right-1;

else k = right;

j--;i++;

while(k>=q) swap(l[k],l[i]);k--;i++;

for(k = left;k<=p;k++;j--) swap(l[k],l[j]);

quciksort(l,left,j);

quciksort(l,i,right);

}

常用排序方法(一)

氣泡排序 演算法原理 每次前乙個元素與後乙個元素比較,若前者大則交換。include void change int pdata,int count change data,6 插入排序 排序原理是抽出牌,在前面的牌中尋找相應的位置插入,然後繼續下一張 include stdio.h void in...

常用排序方法(一)

排序,是將一組物件按照規定的次序重新排列的過程,排序往往是為檢索服務的。排序可分為兩大類 內部排序和外部排序,我們這裡只討論內部排序。內部排序的方法主要有以下四種 插入排序 交換排序 選擇排序和歸併排序。一 插入排序 插入排序又分為直接插入排序 折半插入排序 表插入排序和希爾排序。不過我們最常用的就...

java常用排序演算法 一

氣泡排序演算法 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。相同元素前後順序並沒有改變,所以氣泡排序是一種穩定排序演算法 總結 每次判斷大的放到最後...