第九章 排序(2021-4-22)

在这里插入图片描述


9.2、排序的基本概念与分类

9.2.0、什么是排序?

在这里插入图片描述

9.2.1、排序的稳定性

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

9.2.2、内排序与外排序

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

9.2.3、排序用到的结构与函数

在这里插入图片描述

#define MAX_SIZE 10    //用于要排序数组个数最大值,可根据需要修改
typedef struct
{
	int r[MAX_SIZE + 1];     //用于存储要排序数组,r[0]用作哨兵或临时变量
	int length;              //用于记录顺序表的长度
}SqList;
//交换L中数组r的下标为i和j的值
void swap( SqList *L, int i, int j )
{
	int temp = L->r[i];
	L->r[i] = L->r[j];
	L->r[j] = temp ;
}

9.3、冒泡排序

9.3.1、最简单排序实现

在这里插入图片描述

#include <stdio.h>

void BubbleSort( int k[], int n )
{
	int i, j, temp;
	int count1 = 0;                     //计数器
	int count2 = 0;
	
	for( i = 0; i < n-1; i++ )
	{
		for( j = i+1; j < n; j++ )
		{
			count1++;                   //每执行一次判断就+1
			if( k[i] > k[j] )
			{
				count2++;               //每改变一次位置就+1
				temp = k[i];
				k[i] = k[j];
				k[j] = temp;
				
			}
			
		}	
	}
	printf( "总共进行了%d次比较.\n", count1 );
	printf( "总共进行了%d次移动.\n", count2 );
	
}

int main()
{
	int i, a[9] = {9, 1, 5, 8, 3, 7, 4, 6, 2};
	BubbleSort( a, 9 );
	
	for( i=0; i<9; i++ )
	{
		printf( "a[%d] = %d.\n", i, a[i] );
	}
	
}

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

9.3.2、(正宗)冒泡排序算法

#include <stdio.h>

void BubbleSort( int k[], int n )
{
	int i, j, temp;
	int count1 = 0;                     //计数器
	int count2 = 0;
	
	for( i = 0; i < n-1; i++ )          //一共比较n-1次
	{
		
		for( j = n-1; j > i; j-- )      //从下往上比较,每一次会把最小的移到最恰面
		{
			count1++;                   //每执行一次判断就+1
			if( k[j-1] > k[j] )
			{
				count2++;               //每改变一次位置就+1
				temp = k[j-1];
				k[j-1] = k[j];
				k[j] = temp;
				
			}
			
		}	
	}
	
	printf( "总共进行了%d次比较.\n", count1 );
	printf( "总共进行了%d次移动.\n", count2 );
	
}

int main()
{
	int i, a[9] = {9, 1, 5, 8, 3, 7, 4, 6, 2};
	BubbleSort( a, 9 );
	
	for( i=0; i<9; i++ )
	{
		printf( "a[%d] = %d.\n", i, a[i] );
	}
	
}

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

9.3.3、冒泡排序优化

#include <stdio.h>

void BubbleSort( int k[], int n )
{
	int i, j, temp;
	int flag = 1;                        //flah用来做标记
	int count1 = 0;                     //计数器
	int count2 = 0;
	
	
	for( i = 0; i < n-1 && flag; i++ )          //若flag为true退出循环
	{
		
		for( j = n-1; j > i; j-- )      //从下往上比较,每一次会把最小的移到最恰面
		{
			count1++;                   //每执行一次判断就+1
			flag = 0;                   //初始值flag
			if( k[j-1] > k[j] )
			{
				flag = 1;              //如果有数据交换,flag为true。
				count2++;               //每改变一次位置就+1
				temp = k[j-1];
				k[j-1] = k[j];
				k[j] = temp;
				
			}
			
		}	
	}
	
	printf( "总共进行了%d次比较.\n", count1 );
	printf( "总共进行了%d次移动.\n", count2 );
	
}

int main()
{
	int i, a[9] = {2, 1, 3, 4, 5, 6, 7, 8, 9};
	BubbleSort( a, 9 );
	
	for( i=0; i<9; i++ )
	{
		printf( "a[%d] = %d.\n", i, a[i] );
	}
	
}

在这里插入图片描述

9.3.4、冒泡排序复杂度分析

在这里插入图片描述


9.4、简单选择排序

9.1、简单选择排序算法

在这里插入图片描述

#include <stdio.h>

void SelectSort( int k[], int n )
{
	int i, j, min, temp;
	int count1 = 0;                     //计数器
	int count2 = 0;
	
	for( i=0; i < n-1; i++ )
	{
		min = i;                       //将当前下标定义为最小值下标 
		for( j=i+1; j < n; j++ )       //循环之后的数据
		{
			count1++;                   //每执行一次判断就+1
			
			if( k[j] < k[min] )         //如果有小于当前最小值的关键字
			{
				min = j;               //将此关键字的下标赋值给min
			}
			
		}
		
		if( min != i )              //若min不等于i,说明找到最小值
		{
			count2++;               //每改变一次位置就+1
			temp = k[min];          //交换值
			k[min] = k[i];
			k[i] = temp;
			
		}
		
	}
	
	printf( "总共进行了%d次比较.\n", count1 );
	printf( "总共进行了%d次移动.\n", count2 );
	

}

int main()
{
	int i, a[9] = {9, 1, 5, 8, 3, 7, 4, 6, 2};
	SelectSort( a, 9 );
	
	for( i=0; i < 9; i++ )
	{
		printf( "a[%d] = %d.\n", i, a[i] );
	}
	
}

9.4.2、简单选择排序复杂度分析

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值