C語言常用排序法----結合順序表

首先定義順序表,實現由小到大的排序

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