栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言练习-day16

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言练习-day16

希尔排序

输入:表长length,以及表中各元素的值,类型为int。

输出:表内的值按由小至大输出。

优化目标:无

分析:1.不稳定排序;2.只能用于顺序结构,不能用于链式结构;3.增量序列可以有各种取法,但应该使增量序列中值没有除1之外的公因子,并且最后一个增量值必须等于1;4.记录总的比较次数和移动次数都比直接插入排序要少,n越大时,效果越明显。所以适用于初始记录无序、n较大时的情况。

#include
#include

#define MAXSIZE 20

typedef struct{
	int key;  //关键字
}KeyType;

typedef struct{
	KeyType R[MAXSIZE+1];   //R[0]闲置
	int length;   //顺序表的长度
}SqList;

//单次希尔排序
void ShellInsert(SqList &L,int dk){
	int i,j;
	for(i = dk+1;i<=L.length;i++){
		if(L.R[i].key0&&L.R[0].key 

 

快速排序

输入:表长length,以及表中各元素的值,类型为int。

输出:表内的值按由小至大输出。

优化目标:无

分析:1.不稳定排序;2.排序过程中需要定位表的下界和上界,所以适合用于顺序结构,很难用于链式结构;3.当n较大时,在平均情况下快速排序是所有内部排序方法中速度最快的一种,所以其适合初始记录无序、n较大时的情况。

#include
#include

#define MAXSIZE 20

typedef struct{
	int key;  //关键字
}KeyType;

typedef struct{
	KeyType R[MAXSIZE+1];   //R[0]闲置
	int length;   //顺序表的长度
}SqList;

//对顺序表中的子表R[low..high]进行一次排序,返回枢轴位置
int Partition(SqList &L,int low,int high){
	L.R[0] = L.R[low];
	int p = L.R[low].key;
	while(low < high){
		while(low < high && L.R[high].key>=p){
			--high;
		}
		L.R[low] = L.R[high];
		while(low < high && L.R[low].key<=p){
			low++;
		}
		L.R[high] = L.R[low];
	}
	L.R[low] = L.R[0];
	return low;
}

//对子表R[low..high]进行一次快速排序
void QSort(SqList &L,int low,int high){
	if(low 

 

堆排序

输入:表长length,以及表中各元素的值,类型为int。

输出:表内的值按由小至大输出。

优化目标:无

分析:1.不稳定排序;2.只能用于顺序结构,不能用于链式结构;3.初始建堆所需要的比较次数较多,因此记录数较少时不宜采用。

#include
#include

#define MAXSIZE 20

typedef struct{
	int key;  //关键字
}KeyType;

typedef struct{
	KeyType R[MAXSIZE+1];   //R[0]闲置
	int length;   //顺序表的长度
}SqList;

//将R[s..m]调整为以R[s]为根的大根堆
void HeapAdjust(SqList &L,int s,int m){
	KeyType rc = L.R[s];
	int j;
	for(j = 2*s;j<=m;j = j*2){
		if(j=L.R[j].key){
			break;
		}
		L.R[s] = L.R[j];
		s = j;
	}
	L.R[s] = rc;
}

//把无序序列建成大根堆
void CreatHeap(SqList &L){
	int n = L.length;
	int i;
	for(i = n/2;i>0;i--){
		HeapAdjust(L,i,n);
	}
}

//堆排序
void HeapSort(SqList &L){
	CreatHeap(L);
	int i;
	for(i=L.length;i>1;i--){
		KeyType x = L.R[i];
		L.R[1] = L.R[i];
		L.R[i] = x;
		HeapAdjust(L,1,i-1);
	}
}

//初始化列表
void ListInit(SqList &L){
	int i,length,key;	
	for(i = 1;i<=MAXSIZE;i++){
		L.R[i].key = 0;
	}
	
	printf("请输入顺序表的长度(小于20):");

	scanf("%d",&length);
	L.length = length;
	for(i = 1;i<=length;i++){
		printf("请输入第%d个元素:",i);
		scanf("%d",&key);
		L.R[i].key = key;
	}
}

//输出列表
void PrintList(SqList L){
	int i;
	printf("排序结果是:");
	for(i = 1;i<=L.length;i++){

		printf("%d  ",L.R[i].key);
	}
}


int main(){
	SqList L;
	ListInit(L);
	HeapSort(L);
	PrintList(L);
	
	return 0;
}

今天主要复习了一下比较复杂的排序方法(希尔排序、快速排序、堆排序),排序方法很多,每一种方法都有各自的优缺点,适合在不同的环境下使用。当待排序列的记录个数n较小时,可以选用简单的排序;当n较大时,应选用先进的排序方法。明天打算针对线性表的题目进行练习,然后还要对前面的知识再复习。

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/767998.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号