C语言数据结构与算法---简单的排序

一. 排序的基本概念

1. 排序的分类

在这里插入图片描述

2. 具体的的解析

  1. 什么是稳定性
    假设 Ki = Kj ( 1<= i <=n, 1<= j <=n ,i≠j),且在排序浅的序列中 ri 领先于rj (即 i < j)。如果排序后 ri 仍领先于 rj,则称所用的排序方法是最稳定的;反之,若可能使得排序后的序列中 rj 领先于 ri 则称所用的排序方法是不稳定的。

  2. 按存储介质分为

  • 内部排序:数据量不大,数据在内存,无需内外存交换数据------内排序又分为:插入排序,交换排序,选择排序,归并排序
  • 外部排序:数据量较大,数据在外存(文件排序)----- 由于排序的记录个数太多,不能同时放置在内存,整个排序过程需要在内外存之间多次交换数据才能进行。
  1. 按比较器个数分为
  • 串行排序:单处理机(同一时刻比较一对元素)
  • 并行排序:多处理机(同一时刻比较多对元素)

二. 简单的排序实现

由于排序中最常用到元素交换,为了方便,我们将它写为函数

void swap(int r,int i,int j)
{
	int temp = r[i];
	r[i] = r[j];
	r[j] = temp;
}

1. 冒泡排序

void BubbleSort1(int *r,int lenth)
{
	int i,j; 
	for(i = 0;i < length-1;i++)
	{
		for (j = 0;j < length-1-i; j++)
		{
			if(r[j] > [j+1])
			{
				swap(r,j,j+1);
			}
		}
	}
}

2. 简单的选择排序

void SelectSort(int *r,int lenth)
{
	int i, j;
	for (i = 0; i < length-1; i++)
	{
		for (j = i + 1; j < length; j++)
		{
			if (r[i] > r[j]) 
			{
				swap(r, i, min);
			}
		}
	}
}

3. 插入排序

将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数加一的有序表。例如:整理扑克牌
在这里插入图片描述

  1. 直接插入排序
    采用顺序查找法查找插入位置
    使用哨兵
    在这里插入图片描述
// r[0] 为哨兵
//如果这个元素比它前面一个元素要小,那么就用 0 号元素记录这个值,从前一个元素开始,不断的与 0 号元素比较
void InsertSort1(int *r,int length)
{
	int i,j;
	for(i = 2;i < = n;i++)  //从第二个元素开始
	{
		if(r[i] < r[i-1])  //若要插入的元素已经比前一个大就直接放在最后
		{
			r[0] = r[i];  //记录i处的值
			for(j=i-1;r[j] > r[0];j--)
			{
				r[j + 1] = r[j];  //数据不断后移
			}
				r[j + 1] = r[0];  //插入正确位置
		}
	}
}
  1. 折半插入排序
    在这里插入图片描述
void InsertSort2(int *r,int length)
{
	int i,j;
	int low,high,mid;
	for(i = 2;i < = n;i++)  //从第二个元素开始
	{
		r[0] = r[i]; 
		low = 1;
		high = i-1;
		while(low <= high)
		{
			mid = (low + high)/2;
			if(r[0] < mid)
			{
				high = mid-1;
			}
			else
			{
				low = mid+1;
			}
		}//循环结束,high+1 为插入位置
		for(j=i-1;j>=high+1;j--)
		{
			r[j+1] = r[j];  //向后移动元素,将r[high+1]空出来
		}
		r[high+1] = r[0]; //插入到正确位置
	}
}
发布了61 篇原创文章 · 获赞 52 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/myjess/article/details/104712074