上兩篇文章,《排序演算法總結(1)——插入排序》、《排序演算法總結(2)——選擇排序》。
排序主要分為插入排序、選擇排序、交換排序、歸併排序、計數(也有叫分配)排序。現在總結一下交換排序
下面開始第三部分:交換排序
三、交換排序
交換排序的基本思想是兩兩比較待排序物件的關鍵碼,如果發生逆序(即排列順序與期望的相反)就交換,直到所有物件都排序完畢。本節將介紹3種常見的交換排序演算法,即氣泡排序、shaker排序和快速排序。
1)氣泡排序
氣泡排序的基本思想是模擬氣泡的上浮過程。可以把陣列想象成乙個豎立的容器,有很多的泡泡(資料元素),大泡泡對應關鍵碼較小的資料元素,小泡泡則對應關鍵碼較大的資料元素,由生活常識可知,顯然大泡泡會首先浮上去。氣泡排序是穩定的演算法。
源**:
void bubblesort(int *a, int len)
j--;
} }}
也有的教材上的源**如下所示:
void bubblesort(int *a, int len)
}
但是我認為上面的**雖然功能上實現了排序,但不是冒泡的那個意思。
2)shaker排序
shaker排序又叫雞尾酒排序或雙向氣泡排序,它是氣泡排序的一種輕微改進。與氣泡排序相同,shaker排序也是一種穩定排序演算法。不同的是,普通的氣泡排序演算法僅是從低到高比較序列裡的每個元素,或者說普通的氣泡排序演算法只能每次從前向後按乙個次序進行遍歷,而sbaker排序方法每次遍歷卻包括兩個方向,先從前向後再從後向前,在從前往後遍歷後能記錄最後發生交換的兩個元素位置,從後往前遍歷時就從這個位置開始。這種雙向交替比較不僅可以使小的浮上水面,同時也會使大的沉入水底,因而較普通的冒泡演算法在效率上有所改進。
源**:
void shakersort(int *a, int len)
} //從右到左
for ( k = j-1; k > i; k --)
}}}
注意:上面演算法還有優化的地方,比如從左向右比較時記錄最後一次發生交換的位置,然後從右向左交換位置時從該位置開始比較。從右到左時同理要記錄最後一次交換時的位置。
源**如下:
void shakersort(int *a, int len)
} //從右到左
for ( k = right ; k > i; k --)
}}}
3) 快速排序
快速排序也稱為分割槽排序,它是一種平均效能非常好的排序方法。它採用了一種分治的策略,其基本思想是取待排序物件序列中的某個物件為基準(比如第乙個物件),按照該關鍵碼的大小,將整個物件序列劃分為左右兩個子串行,其中左側子串行中所有物件的關鍵碼都小於或等於基準物件的關鍵碼,右側子串行中所有物件的關鍵碼都大於基準物件的關鍵碼,基準物件排在這兩個子串行中間,然後分別對這兩個子串行重複施行上述方法,直到排序完成為止。
快速排序演算法僅需要選擇基準項並對包含超過乙個元素的子陣列進行分割槽。
源**:
void quicksort(int *a, int low, int high)
} a[i] = temp;
if (low < i)
quicksort(a, low,i-1);
if (j < high)
quicksort(a, j+1, high);
}
通過理論證明得到快速排序演算法的平均排序時間是o(n*logn)。快速排序之所以被稱為「快速排序」, 也是因為就平均效率而言,它是所有內排序方法中最好的乙個,這二點也已經得到了實驗的證明。
排序演算法 交換排序
交換排序的基本思想 兩兩比較待排序元素的關鍵字,發現兩個元素的次序相反時則進行交換,直到沒有反序的元素為止。1.氣泡排序 交換排序 演算法 氣泡排序 bubble sort 輸入 待排序元素的陣列,待排序元素個數 輸出 原理 通過無序區中相鄰元素間關鍵字的比較和位置的交換,使關鍵字最小的元素如氣泡一...
排序演算法 交換排序
基本思想 在乙個待排序序列中,兩兩比較元素的排序碼,如果不滿足次序要求則進行交換,直到整個排序序列滿足要求。思想 對待排序序列從前向後,依次比較相鄰元素的排序碼,若發生逆序,則進行交換。實現 include void bubblesort int p,int n if flag 減少不必要的比較 r...
交換排序演算法
快速排序 為啥叫快速排序,因為速度快,效率高 1.先找乙個數作為基準。作為基準的這個數,一趟排下來,左邊的數必小於它,右邊的數必大於它,也就是說,它找到了自己的位置。2.將兩個指標i,j分別指向表的起始 基準 和最後的位置。3.比較j指標的數字是否小於基準,j 直到j小於基準,交換位置 4.比較i指...