数据结构--7.2.1排序算法(冒泡、直接选择、直接插入)

一、排序算法概念

假设含有n个记录的序列为{r1,r2,......,rn},其相应的关键字分别为{K1,K2,......,Kn},需确定1,2,3,......,n的一种排序p1,p2,p3,......,pn;使其相应的关键字满足kp1<=kp2<=kp3<=kp4<=......<=kpn非递减(或非递增)关系,即使得序列称为一个按关键字有序得序列{rp1,rp2,......,rpn},这样的操作就成为排序。

在排序问题中,通常将数据元素称为记录。

------显然我们输入得是一个记录集合,排序后输出的也是一个记录的集合。

------所以我们可以将排序看成是线性表的一种操作。

排序的依据是关键字之间的大小关系,那么对同一记录集合,针对不同的关键字进行排序,可以得到不同序列。

排序的稳定性

假设Ki = Kj(1<=i<=n,1<=j<=n,i != j),且在排序前的序列中ri领先于rj(即i<j)。

------如果排序后ri仍然领先于rj,则称所用的排序方法是稳定的;

------反之,若可能使得排序后的序列中rj领先ri,则称所用的排序方法是不稳定的。

影响排序算法性能的几个要素

------时间性能

------辅助空间

------算法的复杂性

二、冒泡排序

冒泡排序的基本思想:两两相邻记录的关键字,如果反序则交换,知道没有反序为止!

cpp 复制代码
#include <stdio.h>
#define t 10

void BobbleSort(int k[],int n)
{
	int i,j,temp;
	for(i=0;i<n-1;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(k[i]>k[j])
			{
				temp = k[j];
				k[j] = k[i];
				k[i] = temp;
			}
		}
	}
}

int main()
{
	int i,a[t] = {4,2,5,10,39,1,3,65,8,6};
	BobbleSort(a,t);
	printf("排序后的结果:\n");
	for(i=0;i<t;i++)
	{
		printf("%d\t",a[i]);
	}
	printf("\n\n");
	return 0;
}

冒泡排序的要点

1、两两注意是相邻的两个元素的意思。

2、如果有n个元素需要比较n-1次,每一轮减少1次比较。

3、既然叫冒泡排序,那就是从下往上两两比较,所以看上去就跟泡泡往上冒一样。

cpp 复制代码
冒泡排序最终版
#include <stdio.h>
#define t 10
int count1=0;
int count2=0;

void BobbleSort(int k[],int n)
{
	int i,j,temp;
	int falg=1;
	for(i=0;i<n-1 && falg;i++)
	{
		for(j=n-1;j>i;j--)
		{
			count1++;
			falg=0;
			if(k[j-1]>k[j])
			{
				count2++;
				temp = k[j-1];
				k[j-1] = k[j];
				k[j] = temp;
				falg = 1;
			}
		}
	}
}

int main()
{
	int i,a[t] = {4,2,5,10,39,1,3,65,99,8};
	BobbleSort(a,t);
	printf("总共进行了%d次比较,进行了%d次移动。",count1,count2);
	printf("排序后的结果:\n");
	for(i=0;i<t;i++)
	{
		printf("%d\t",a[i]);
	}
	printf("\n\n");
	return 0;
}

三、直接选择排序

cpp 复制代码
#include <stdio.h>

void SelectSort(int k[],int n)
{
	int i,j,min,temp;
	for(i=0;i<n-1;i++)
	{
		min = i;
		for(j=i+1;j<n;j++)
		{
			if(k[j]<k[min])
			{
				min = j;
			}
		}
		if(min != i)
		{
			temp = k[min];
			k[min] = k[i];
			k[i] = temp;
		}
	}
}

int main()
{
	int i,a[10]= {5,2,6,0,3,9,1,7,4,8};
	SelectSort(a,10);
	printf("排序后的结果是:\n");
	for(i=0;i<10;i++)
	{
		printf("%d\t",a[i]);
	}
	printf("\n\n");
	return 0;
}

四、直接插入排序

直接插入排序算法(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增加1的有序表。

cpp 复制代码
#include <stdio.h>

void InsertSort(int k[],int n)
{
	int i,j,temp;
	for(i=1;i<n;i++)
	{
		if(k[i]<k[i-1])
		{
			temp = k[i];
			for(j=i-1;k[j]>temp;j--)
			{
				k[j+1] = k[j];
			}
			k[j+1] = temp;
		}
	}
}

int main()
{
	int i,a[10]= {5,2,6,0,3,9,1,7,4,8};
	InsertSort(a,10);
	printf("排序后的结果是:\n");
	for(i=0;i<10;i++)
	{
		printf("%d\t",a[i]);
	}
	printf("\n\n");
	return 0;
}
相关推荐
leiming65 分钟前
C++ 02 函数模板案例
开发语言·c++·算法
自然常数e31 分钟前
深入理解指针(6)
c语言·数据结构·算法·visual studio
Xの哲學31 分钟前
Linux VxLAN深度解析: 从数据平面到内核实现的全面剖析
linux·服务器·算法·架构·边缘计算
TL滕35 分钟前
从0开始学算法——第十八天(分治算法练习)
笔记·学习·算法
一杯美式 no sugar38 分钟前
数据结构——栈
c语言·数据结构·
月明长歌1 小时前
【码道初阶】【LeetCode 958】判定完全二叉树:警惕 BFS 中的“管中窥豹”陷阱
算法·leetcode·宽度优先
蒙奇D索大2 小时前
【数据结构】考研408 | 冲突解决精讲: 拉链法——链式存储的艺术与优化
数据结构·笔记·考研·改行学it
一直都在5722 小时前
数据结构入门:二叉排序树的构建与相关算法
数据结构·算法
_Minato_2 小时前
数据结构知识整理——复杂度的计算
数据结构·经验分享·笔记·算法·软考
listhi5202 小时前
针对燃油运输和车辆调度问题的蚁群算法MATLAB实现
前端·算法·matlab