数据结构——排序

|


在这里插入图片描述
在这里插入图片描述


前言

排序是计算机程序设计中一种重要的操作,排序的主要目的是为了便于查找。


提示:以下是本篇文章正文内容,下面案例可供参考

一、排序是什么?

排序是按照关键字的非递减或非递增序列对一组重新进行排列的操作。

排序分为:内部排序和外部排序

排序的稳定性:一组不规则的序列中有两个相同的数组(他们有前后之分),排之后他们的前后顺序不变,就称这种排序为稳定排序,反之为不稳定排序。
例如 1 2* 0 2排序之后为 0 1 2* 2我们就称排序这组数据的方法具有稳定性。

内部排序的分类:插入类,交换类,选择类,归并类,分配类。

待排序记录的存储方式:顺序表,链表,地址排序。

排序算法效率的评价指标:执行时间,辅助空间(时间复杂度由排序算法所需的辅助空间决定)。

二、排序

待排序记录的数据类型定义为:

#define MAX 20
typedef int KeyType;
typedef struct
{
	KetType Key;
	INfoType otherinfo;//其他数据类型
}RedType;
typedef struct
{
	RedType r[MAX+1];//r[0]作为哨兵单元
	int length;
}SqList;

1.直接插入排序

在这里插入图片描述

代码如下(示例):

	void InsertSort(SqList &S)
	{
		int i,j;
		for(i=2;i<=S.length;i++)
		{
			if(S.r[i].Key>S.r[i-1].Key)
			{
				S.r[0]=S.r[i].Key;
				for(j=i-1;S.r[j].Key>S.r[0].Key;j--)
				{
					S.r[j+1].Key=S.[j].Key;
				}
			}
			S.r[j+1].Key=S.r[0].Key;
		}
	}

2.折半插入排序

折半插入排序就是把直接插入的查找可覆盖位置换成折半查找

下列是升序排序

void HalfSort(SqList &S)
{
	int i,j,low,high,mid;
	for(i=2;i<=S.length;i++)
	{
		S.r[0].Key=S.r[i].Key;
		low=1;
		high=i-1;
		while(low<=high)
		{
			mid=(low+high)/2;
			if(S.r[mid].Key>S.r[0].Key)
			{
				high=mid-1;
			}else
			{
			low=mid+1;
			}
		}
		for(j=i-1;j>=high+1;i--)
		{
		S.r[j+1].Ket=S.[j].Key;
		}
		S.r[high1].Key=S.r[0].Key;
	}//for
	
}

3.希尔排序

希尔排序又称缩小增量排序
在这里插入图片描述


4.选择排序

在这里插入图片描述

void SelectSort(SqList &S)
{
	int i,j,temp;
	int min;//最小值
	for(i=1;i<=S.length-1;i++)
	{
		min=i;
		for(j=i;i<=S.lentgh;j++)
		{
			if(S.r[j].key<S.r[min].key)
			{
				min=j;
			}
		}
		if(min!=i)
		{
		temp=S.r[i].key;
		S.r[i].key=S.r[min].Key;
		}
	}
}

5.堆排序

堆分为大顶堆和小顶堆
大顶堆用于降序排序
小顶堆用于降序排序

在这里插入图片描述

void AdjustHeap(SqList &S,int start,int end)
{
	int c,f;//c和f分别是孩子和双亲结点结点的位置 
	int temp=S.r[start].Key;
	f=start;
	for(c=2*start;c<=end;c*=2)
	{
		if((c<end)&&S.r[c].Key<S.r[c+1].Key)
		{
		c++;
		}
		if(S.r[c].Key>S.r[c].Key)
		{
		brek;
		}
		S.r[f].Key=S.r[c].Key;;
		f=c;
		
	}
	S.r[f].Key=temp;
	

}
void CrateHeap(SqList &S)
{
	int i;	
	for(i=(S.length+1)/2;i>=1;i--)
	{
	AdjustHeap(S,i,S.length);
	}
}
void HeapSort(SqList &S)
{
	int i;
	int temp;
	CrateHeap(S);
	
	for(i=S.length;i>=1;i--)
	{
		temp=S.r[1].Key;
		S.r[1].Key=S.r[i].Key;
		S.r[i].Key=temp;
		printf("%d\t",S.r[i].temp);
		AdjustHeap(S,1,i);
	}

}


6.冒泡排序

在这里插入图片描述

void BubbleSort(SqList &S)
{
	int i,j,flag,temp;
	i=S.length;
	flag=1;//flag=1说明这一次循环有数据交换
	while((i>=1)&&flag==1)
	{
		flag=0;//默认数组是有序的
		for(j=1;j<=S.length-i-1;j++)
		{
			if(S.r[j].Key>S.r[j+1].Key)
			{
				flag=1;//数据进行了比较
				temp=S.r[j].Key;
				S.r[j].Key=S.r[j+1].Key;
				S.r[j+1].Key=temp;
			}
		}
		i--;
	}

}

7.快速排序

在这里插入图片描述

//将数组划分为两个区域
int partition(SqList &S,int low,int high)
{
	S.r[0].Key=S.r[low].Key;
	while(low<high)
	{
		while((low<high)&&S.r[high].Key>S.r[0].Key)
		{
			high--;
		}
		S.r[low].Key=S.r[high].Key;
		while((low<high)S.r[low].Key<S.r[0].Key)
		{
			low++;
		}
		S.r[high].Key=S.r[low].Key;
	}
	S.r[low/high].Key=S.r[0].Key;
	return low/high;
}
void QSort(SqList &S,int low,int high)
{
	int mid; 
	while(low<high)
	{
		mid=Partition(S,low,high);
		Partition(S,low,mid-1);
		partition(S,mid+1,high);
	}
}
void QucikSort(SqList &S)
{
	QSort(S,1,S.length);
}

总结

以上就是今天要讲的内容,本文仅仅简单介绍了排序方法,当然还有很多别的排序方法归并排序和非比较排序,这些我会后续更新。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值