首先定義順序表,實現由小到大的排序
typedef int ElemType ;
typedef struct {
ElemType *elem;
int length;
int listsize;
}SqList;//SqList是結構體名字
L.length爲數組長度
- 冒泡排序法:將每個元素和他後面剩餘元素相比較,需要比較次數很多,因而效率也低~
//第一個數不需要比較,所以爲L.length-1
for(int i=0;i<L.length-1;i++){
for(int j=i+1;j<L.length;j++){
if(L.elem[i]>L.elem[j]){
ElemType e;
e=L.elem[i];
L.elem[i]=L.elem[j];
L.elem[j]=e;
}
}
}
- 選擇排序法:在冒泡基礎上加上了最小元素下標k。將每個元素也他後面的元素相比較,如果L.elem[i]小於L.elem[j],那麼就k=i,通過判斷每次下標是否爲i來選擇是否要進行元素換位。
for(int i=0;i<L.length-1;i++){
int k=i;
for(int j=i+1;j<L.length;j++){
if(L.elem[k]>L.elem[j]) k=j;
}
if(i!=k){
int e;
e=L.elem[i];
L.elem[i]=L.elem[k];
L.elem[k]=e;
}
}
- 快速排序法:通俗見解,其實就是一半一半排序,以整體的中點爲界分爲兩個區間a,b,前一區間a的值都大於區間起始點M,後一區間b的值均小於M,重複,直至到達區間中點;再取前一區間起點M1,再將前一區間分爲兩部分a1,b1,a1前一區間的值均大於M1,a1後一區間的值均小於M1,b1也是如此,重複進行,直至到達區間中點。
void quick_sort( SqList &L, int l, int r)
{
if (l < r)
{
//將中間的這個數和第一個數交換
//x定爲第一個元素
int i = l, j = r, x = L.elem[l];
while (i < j){
//這裏因爲我們是j--,i++,j--,i++。。。。因此,我們的循環可以以j--作爲開始
while(i < j && L.elem[j] >= x) // 從右向左找第一個小於x的數
j--;
if(i < j)
L.elem[i++] = L.elem[j];
while(i < j && L.elem[i] < x) // 從左向右找第一個大於等於x的數
i++;
if(i < j)
L.elem[j--] = L.elem[i];
}
//定向到i的位置
L.elem[i] = x;
quick_sort(L, l, i - 1); // 遞歸調用
quick_sort(L, i + 1, r);
}
}