IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构(几种排序) -> 正文阅读

[数据结构与算法]数据结构(几种排序)

数据结构中排序的方法主要有6种:插入排序,希尔排序,冒泡排序,折半排序,快速排序和简单排序。下面我们对于6中排序方法来一一讲解。

结构准备

#include <stdio.h>
#include <stdlib.h>

typedef int keytype;
typedef char elemtype;
typedef struct
{
   keytype key;
   elemtype data;           //在排序中没有用到data
}RecType;

1.插入排序

以表L[n]为例来讲解。排序的方法是从表的头开始,当存在L[i]>L[i-1]时,我们又从第一个元素开始依次查找,当找到小于L[i-1]的元素L[k]时,将L[k]到L[i-1]的元素依次向前移动一位,最后将L[i]插入L[k]的位置。

从头开始,先让前面依次成递增排列,最后使整个表成递增排列。代码实现如下:

void InsertSort(RecType L[],int n)
{
	int team;
	for(int i=1;i<n;i++)           //在表中从前向后查找
	{
		if(L[i].key<L[i-1].key)    //当存在后面的数小于前面的数时,调整位置
		{
			team=L[i].key;         //将前面的数赋值给team;
			int j=i-1;
		    while(team<L[j].key)
		    {
		    	L[j+1].key=L[j].key;  //将后面小于team的数依次移动,找到L[i]应该插入的位置
		    	j--;
			}
			L[j+1].key=team;         //插入该位置
		}
	}
}

2.希尔排序

希尔排序主要是通过确定一个数d,将表中距离为d的数依次进行比较,如果有L[i]>L[i+d]的情况,将两个元素交换位置。然后在使用d=d/2继续进行该操作,在使用d/4继续进行该操作,直到d<0,最后使整个表成有序排列。排序完成。

希尔排序的特点是大量减少了空间复杂度,代码实现如下:

void ShellSort(RecType L[],int n)
{
	int d,team;
	d=n/2;                              //选择d为表的长度的一半
	while(d>0)                           
	{
		for(int i=1;i+d<=n;i++)         //当i+d超过表长度时,停止。 
		{
			if(L[i].key>L[i+d].key)     //存在L[i]>L[i+d]时,通过team对两个数进行交换
			{
				team=L[i].key;
				L[i].key=L[i+d].key;
				L[i+d].key=team;
			}
		}
		d=d/2;                          //将d减少一半,继续进行排序
	}
}

3.冒泡排序

冒泡排序的方法是在1~n中找到一个最大的数排在最后面,在从1~n-1中找到一个最大的数排到次后面,然后在从1~n-2中找到一个第三大树树放在第n-2个,依次从尾到头排成一个有序的表。主要的实现方法是从第一个元素开始,比较相邻的两个元素,如果大的数在前面,就将两个相邻的数互换。相当于最大的数想泡泡一样冒出到最后面,因此叫做冒泡排序。

冒泡排序的主要优点是时间复杂度低,运算较快,代码实现如下:

void BubbleSort(RecType L[],int n)
{
	int team;
	for(int i=n-1;i>=1;i--)             //从尾部开始,找到一个最大的数
		for(int j=1;j<=i;j++)
		{
			if(L[j].key>=L[j+1].key)     //如果相邻的两个数中前面的书大于后面的数
			{                    
				team=L[j+1].key;         //将大的数放在后面,直到将最大的数放到最后面  
                L[j+1].key=L[j].key;
                L[j].key=team;
			}
		}
}

4.快速排序

快速排序的基本方法是将一个表通过两个“指针”同时分别从头到尾和从尾到头进行排序。最后将一个表排序完成。

首先选择一个基准,以基准为单位,分别从两端向中间扫描,知道两个“指针”相遇。将左边大于基准的数和右边小于基准的数互换。然后在两个“指针”相遇的位置分别在左右两边递归,知道将整个表全部成递增排列。

快速排序是所以排序中最快的排序方法,代码实现如下:

int fanghui(biao L[],int s,int t)        //选择头为s,尾部为t.
{
	int i=s,j=t;                         //定义两个指针,i在头部,j在尾部。
	int team;
	team=L[i].key;                       //选择头部的第一个元素为基准。
	while(i<j)
	{
		while(j>i&&L[j].key>=team)       //“指针”j从尾部向中间扫描。
		  j--;
		L[i].key=L[j].key;               
		while(i<j&&L[i].key<=L[j].key)   //“指针”i从头部向中间扫描
		  i++;
		L[j].key=L[i].key;               //将头部i扫描到的大于基准的元素与尾部j扫描到的
	}                                      小于基准的元素互换。    
	L[i].key=team;
	return i;                             //返回相遇的位置
}
void kuaishu(biao L[],int s,int t)
{
	int i;
	if(s<t)
	{                             
		i=fanghui(L,s,t); 
		kuaishu(L,s,t-1);                 //左边进行快速排序。
		kuaishu(L,i+1,t);                 //右边进行快速排序。
	}                                     //最后整个表排序完成
}

5.折半排序

折半排序是通过折半的方式查找元素的位置,然后将元素与该位置的元素互换。主要实现的方式是:从第一个元素开始向后查找,如果发现相邻的两个元素中前面的元素大于后面的元素(L[i]>L[i+1]),将前面的元素使用折半查找法找到小于L[i+1]的元素,然后将L[i+1]与该位置前面的元素互换。

代码实现如下:

void BinInsertSort(RecType L[],int n)
{
	int team,j;
	for(int i=1;i<n;i++)
	{
		if(L[i].key<L[i-1].key)
		{
			team=L[i].key;
			int team=L[i].key;
			int zuo,you,zhong;
			zuo=0;you=i-1;
		    while(zuo<=you)
		    {
		    	zhong=(zuo+you)/2;
		    	if(L[zhong].key>team)
		    	  you=zhong-1;
		    	else if(L[zhong].key<team)
		    	  zuo=zhong+1;
		    }
		for(j=i;j>zuo;j--)
			L[j].key=L[j-1].key;
		L[j].key=team;
		}
	}
}

6.简单排序

简单排序是从一个元素开始,在后面的元素中选择最小的元素与第一个元素相互赋值,直到最后一个元素。相当于先从1~n中选择一个最小的元素,若元素小于L[0],将L[0]与该元素相互赋值,将最小的元素排在第一位。然后通过同样的方式在2~n中选择一个最

小的元素放在第二位,直到将最大的元素排到最后一位,排序完成。

简单排序的特点是容易理解,也是生活中最简单的一种排序方法,代码实现如下:

void SelectSrot(biao L[],int n)
{
	int k,team;
	for(int i=1;i<=n-1;i++)          
	{
		k=i;                        //将i的值赋给k
		for(int j=i+1;j<=n;j++)     //从i+1开始查找,找到最小的元素。
			if(L[k].key>L[j].key)
			  k=j;                  //通过k记录该元素的位置
		if(k!=i)                    //将i位置的元素与k位置的元素相互赋值,完成互换
		{
			team=L[k].key;
			L[k].key=L[i].key;
			L[i].key=team;
		}
	}
}

简单排序和插入排序的区别是简单排序是通过交换元素值进行排序,而插入排序是通过交换元素的位置进行排序。

本人作为一名计算机的初学者,这是本人在CSDN上面发布的第一遍博客,欢迎大家前来指点修正,谢谢。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:43:26  更:2022-09-13 11:45:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 12:12:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码