排序

本文介绍了多种经典的排序算法,包括冒泡排序、选择排序、插入排序、希尔排序、快速排序及堆排序等,并提供了详细的C语言实现代码。每种算法都附有清晰的注释,便于理解其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


#define MAXSIZE 10

typedef struct 
{
	int r[MAXSIZE+1];//用于存储排序数组,r[0]用作哨兵或临时变量
	int length;//用于记录顺序表的长度
}SqList;

//
void swap(SqList* L,int i,int j){
	int temp = L->r[i];
	L->r[i] = L->r[j];
	L->r[j] = temp;
}

//
void BubbleSort0(SqList* L){
	int i,j;
	for(i = 1;i<L->length;i++){
		for(j = i+1;j<=L->length;j++){
			if(L->r[i] > L->r[j])
				swap(L,i,j);
		}
	}
}
//正宗的冒泡排序
void BuddleSort(SqList *L){
	int i,j;
	for(i = 1;i<L->length;i++){
		for(j = L->length-1;j>=i;j--){
			if(L->r[j]>L->r[j+1])
				swap(L,j,j+1);
		}
	}
}

//冒泡排序的改进,如果有一趟没有进行排序,则已经排好序
//正宗的冒泡排序
void BuddleSort(SqList *L){
	int i,j;
	Status flag = TRUE;
	for(i = 1;i<L->length&&flag;i++){
		flat = false;
		for(j = L->length-1;j>=i;j--){
			if(L->r[j]>L->r[j+1])
			{
				swap(L,j,j+1);
				flag = true;
			}
		}
	}
}


//选择排序
void SelectSort(SqList *L){
	int i,j,min;
	for(i=1;i<L->length;i++){
		min = i;
		for(j = i+1;j<=L->length;j++){
			if(L->r[min]>L->r[j])
				min = j;
		}
		if(i != min)
			swap(L,i,min);
	}
}

//直接插入排序,
//r[0]哨兵的作用是暂时记录要排序的值
void InsertSort(SqList *L){
	int i ,j;
	for(i = 2;i<= L->length;i++){
		if(L->r[i]<L->r[i-1]){
			L->r[0] = L->r[i];
			for(j = i-1;L->r[j]>L->r[0];j--){
				L->r[j+1]= L->r[j];
			L->j[j+1] = L->r[0];
		}
	}
}

//希尔排序
void ShellSort(SqList *L){
	int i,j;
	int increment = L->length;
	do{
		increment = increment/3 + 1;
		for(i = increment+1;i<=L->length;i++){
			L->r[0] = L->r[i];
			for(j=i-increment;j>0&&L->r[0]<L->r[j];j-=increment)
				L->r[j+increment] = L->r[j];
			L->r[j+increment] = L->r[0];
		}
	}while(increment >1)
}
//快速排序
void QuickSort(QList* L){
     QSort(L,1,L->length);
}

void QSort(QList *,int low,int high){
     int pivot;
     if(low<high){
           pivot = Partition(L,low,high);
          
           QSort(L,low,pivot-1);
           QSort(L,pivot+1,high);
     }
}

void Partion(QList *L,int low,int high)
{
     int pivot;
     int pivotkey = L->r[low];
     while(low < high){
               while(low < high&&L->r[high]>=pivotKey)
                         high--;
               swap(L,low,high);
               while(low<high&&L->r[low] <= pivotKey)
                         low++;
               swap(L,low,high);
     }
     return low;
}


//堆排序
void HeapSort(SqList *L){
	int i ;
	for(i = L->length/2;i>0;i--){
		HeapAdjust(L,i,L->length);
	}
	for(i = L->length;i>1;i--){
		swap(L,1,i);
		HeapAdjust(L,1,i-a);
	}
}

//
void HeapAdjust(SqList *L,int s,int m){
	int temp,j;
	temp = L->r[s];
	for(j = 2*s;j <= m;j*= 2){
		if(j <m&&L->r[j]<L->r[j+1])
			++j;
		if(temp >= L->r[j])
			break;
		L->r[s] = L->r[j];
		s = j;
	}
	L->r[s] = temp;
}
		

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值