C语言数据结构——交换排序

定义排序算法的数据元素的数据结构如下:

typedef struct
{
	KeyType key;
}DataType;

一、冒泡排序

算法思想:依次比较相邻的两个记录的关键字,若两个记录是反序的(即前一个记录的关键字大于后前一个记录的关键字),则进行交换,直到没有反序的记录为止。
(1)首先将L->R[0]与L->R[1]的关键字进行比较,若为反序(L->R[0]的关键字大于L->R[1]的关键字),则交换两个记录;然后比较L->R[1]与L->R[2]的关键字,依此类推,直到L->R[n-2]与L->R[n-1]的关键字比较后为止,称为一趟冒泡排序,L->R[n-1]为关键字最大的记录。
(2)然后进行第二趟冒泡排序,对前n-1个记录进行同样的操作。
一般地,第i趟冒泡排序是对L->R[0 … n-i]中的记录进行的,因此,若待排序的记录有n个,则要经过n-1趟冒泡排序才能使所有的记录有序。

冒泡排序算法的排序过程

在这里插入图片描述

冒泡排序算法

Void BubbleSort(DataType a[],int n)
{
	int i, j, flag =1;
	DataType temp;		
	for(i = 1;i < n && flag == 1; i++)
	{ 
		//flag标记一趟冒泡如果没有发生交换,则已经排好序,提前结束循环
	  	flag = 0;
	  	for(j = 0;j < n  - i; j++)
	 	{	
			if(a[j].key>a[j+1].key)
			{
				flag = 1;
				temp = a[j];
				a[j] = a[j+1] ;
				a[j+1] = temp;
	  		}
		}
	}
}

二、快速排序

基本思想:
从待排序列中任取一个元素 (例如取第一个) 作为中心,所有比它小的元素一律前放,所有比它大的元素一律后放,形成左右两个子表;
然后再对各子表重新选择中心元素并依此规则调整,直到每个子表的元素只剩一个。此时便为有序序列了。

一趟快速排序方法

从序列的两端交替扫描各个记录,先从右端扫描,将关键字小于基准关键字的记录依次放置到序列的前边;然后从左端扫描,将关键字大于基准关键字的记录从序列的最后端起,依次放置到序列的后边,直到扫描完所有的记录。
设置指针low,high,初值为第1个和最后一个记录的位置。
设两个变量i,j,初始时令i=low,j=high,以 R[low].key作为基准(将R[low]保存在temp中) 。
① 从j所指位置向前搜索:将temp.key与R[j].key进行比较:
若temp.key≤R[j].key :令j=j-1,然后继续进行比较, 直到i=j或temp.key>R[j].key为止;
若temp.key>R[j].key :R[j]R[i],腾空R[j]的位置, 且令i=i+1;
② 从i所指位置起向后搜索:将temp.key与R[i].key进行比较:
若temp.key≥R[i].key :令i=i+1,然后继续进行比较, 直到i=j或temp.key<R[i].key为止;
若temp.key<R[i].key :R[i]R[j],腾空R[i]的位置, 且令j=j-1;
③ 重复①、②,直至i=j为止,i就是temp(基准)所应放置的位置。

快速排序算法一次快速排序过程

在这里插入图片描述

快速排序算法实现

void QuickSort(DataType a[],int low, int high)
{
int i=low,j=high;
DataType temp=a[low];	
while(i<j)
{
	while(i < j && temp.key <= a[j].key) j--; //在数组的右端扫描
	if(i < j)
	{
	 	a[i] = a[j];
		i++;
	}
	while(i < j && a[i].key < temp.key) i++; //在数组的左端扫描
	if(i < j)
	{
		a[j] = a[i];
		j--;
	}
}
a[i]=temp;
if(low<i) QuickSort(a,low,i-1);
if(i<high) QuickSort(a,j+1,high);
}

快速排序算法各次快速排序过程

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值