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