【数组的排序方法】 选择法、冒泡法、交换法、插入法、折半法

2023-05-16

目录

 前言

一、选择法排序

二、冒泡法排序

三、交换法排序

四、插入法排序

五、折半法排序


 

 前言

       我们前面已经了解过数组的理论知识,但虽说数组是一个有序的集合,但这里的顺序指的是数组元素所在数组中的位置,我们接下来要说到的就是如何给数组里的数据按照大小顺序来排序。


一、选择法排序

       顾名思义,选择法就是每次选择数组中最大或者最小的数组元素,将这个数组元素的值与前面没有进行排序的数组元素的值互换。

示例程序如下(降序排列):

#include<stdio.h>
int main()
{
	int i, j;
	int a[10];
	int iTemp;
	int iPos;
	printf("请输入数组中的元素的值:\n");
	for (i = 0; i < 10; i++)
	{
		printf("a[%d]=", i);
		scanf_s("%d", &a[i]);
	}
	//排序
	for (i = 0; i < 9; i++)
	{
		iTemp = a[i];
		iPos = i;
		for (j = i + 1; j < 10; j++)
		{
			if (a[j] > iTemp)
			{
				iTemp = a[j];
				iPos = j;
			}
		}
		a[iPos] = a[i];
		a[i] = iTemp;
	}
	//输出
	for (i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
		if (i == 4)
			printf("\n");
	}
	return 0;
}

 运行结果如下:

       然后这个选择法的运行逻辑就是先选取第一个数组元素,然后从这个数组元素之后的元素开始挨着与这个元素比较大小,如果大于所选取的数组元素,那就将这个元素的值与开始元素交换,全部运行完之后输出结果。


二、冒泡法排序

       前面的选择法是依次把未排序的最大的数组元素排到开头或末尾,然后冒泡法是设置嵌套循环,进行若干(数组元素个数)次相邻数组元素之间的交换。

#include<stdio.h>
int main()
{
	int i, j;
	int a[10];
	int iTemp;
	int iPos;
	printf("请输入数组中的元素的值:\n");
	for (i = 0; i < 10; i++)
	{
		printf("a[%d]=", i);
		scanf_s("%d", &a[i]);
	}
    for (i = 9; i > 0; i--)
	{
		for (j = 0; j <= i; j++)
		{
			if (a[j] < a[j+1])
			{
				iTemp = a[j + 1];
				a[j + 1] = a[j];
				a[j] = iTemp;
			}
		}
	}
	//输出
	for (i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
		if (i == 4)
			printf("\n");
	}
	return 0;
}

运行结果就不放图了,与第一个相同,都是递减。


三、交换法排序

       交换法排序是将每一位数与其其后的所有书一一比较,如果发现符合条件的数据则进行交换数据。

递增示例如下:

#include<stdio.h>
int main()
{
	int i, j;
	int a[10];
	int iTemp;
	int iPos;
	printf("请输入数组中的元素的值:\n");
	for (i = 0; i < 10; i++)
	{
		printf("a[%d]=", i);
		scanf_s("%d", &a[i]);
	}
	for (i = 0; i < 9; i++)
	{
		for (j = i + 1; j < 10; j++)
		{
			if (a[j] < a[i])
			{
				iTemp = a[i];
				a[i] = a[j];
				a[j] = iTemp;
			}
		}
	}
	//输出
	for (i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
		if (i == 4)
			printf("\n");
	}
	return 0;
}

 

四、插入法排序

       插入法的基本工作原理是抽取一个数据,排在第一位(假设是递减)然后再取后面一个数据与与第一个数据比较,比第一个数据大就放在第一个数据前面,反之放在后面,接下来就是设置类似的嵌套循环,最终完成比较。

#include<stdio.h>
int main()
{
	int i, j;
	int a[10];
	int iTemp;
	int iPos;
	printf("请输入数组中的元素的值:\n");
	for (i = 0; i < 10; i++)
	{
		printf("a[%d]=", i);
		scanf_s("%d", &a[i]);
	}
	for (i = 1; i < 10; i++)
	{
		iTemp=a[i];
		iPos = i - 1;
		while ((iPos >= 0) && (iTemp < a[iPos]))
		{
			a[iPos + 1] = a[iPos];
			iPos--;
		}
		a[iPos + 1] = iTemp;
	}
	//输出
	for (i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
		if (i == 4)
			printf("\n");
	}
	return 0;
}

五、折半法排序

       折半法排序是一种相比起前面的方法更为快速的排序方法,他的基本工作原理是先选取一个中间值,(递增)然后把比中间值小的放在左边,比中间值大的放在右边。

#include<stdio.h>
void Choose(int left, int right, int array[]);
int main()
{
	int i, a[8];
	printf("请输入数组中的元素的值:\n");
	for (i = 0; i < 8; i++)
	{
		printf("a[%d]=", i);
		scanf_s("%d", &a[i]);
	}
	Choose(0, 7, a);
	printf("8个元素升序排列如下:");
	for (i = 0; i < 8; i++)
	{
		printf("%d ", a[i]);
		if (i == 4)
			printf("\n");
	}
	printf("\n");
	return 0;
}
void Choose(int left, int right, int array[])
{
	int i, j;
	int middle, iTemp;
	i = left;
	j = right;
	middle = array[(left + right) / 2];
	do
	{
		while ((array[i] < middle) && (i < right))
			i++;
		while ((array[j] > middle) && (j > left))
			j--;
		if (i <= j)
		{
			iTemp = array[i];
			array[i] = array[j];
			array[j] = iTemp;
			i++;
			j--;
		}
	} while (i <= j);
	if (left < j)
		Choose(left, j, array);
	if (right > i)
		Choose(i, right, array);
}

 今天的数组排序就到这里,886:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数组的排序方法】 选择法、冒泡法、交换法、插入法、折半法 的相关文章

随机推荐

  • 利用递归和二叉树实现多位数整数的计算

    题目 xff1a 功能设计 xff1a 读取用户输入的表达式创建表达式树功能遍历表达式树进行表达式求值功能输出表达式计算结果功能 功能实现 xff1a 1 2 3 运行结果 xff1a 用户输入1 xff0c 输入要计算的表达式并以 结尾
  • File类常用方法

    File类 xff1a 代表一个特定的文件或者目录 xff08 文件夹 xff09 xff0c 并提供了若干方法对该文件或目录进行操作 File是指文件和目录路径名的抽象表示形式 构造方法 xff1a File String pathnam
  • takes 3 positional arguments but 4 were given错误

    之前写程序经常会碰到此类问题 xff0c 确认发现并没有少参数 函数为类下函数 xff0c 定义时需要添加self参数 但是 xff01 但是 xff01 为何Python给self赋值而你不必给self赋值 xff1f 创建了一个类MyC
  • C语言如何创建属于自己的头文件?

    要想创建一个属于自己的头文件 xff0c 首先我们要明白它的原理 xff0c 具体分为以下两类 xff1a 1 系统头文件 xff1a 这类头文件 xff0c 是系统里边已经有的 xff0c 它们都有一个特点 xff0c 就是都带括号 xf
  • 51单片机定时器

    目录 前言 一 定时器的介绍及其作用 二 定时器的内部构造及其原理 计算机周期 定时器的工作模式与流程 定时器中断相关寄存器 寄存器的配置 三 程序 总结 前言 下面来介绍学习51单片机第一个也是最常用的片上外设 定时器 该硬件是集成在单片
  • 双系统下对ubuntu系统进行扩容

    由于起初装ubuntu系统时啥也不懂 xff0c 从windiws系统中分配给ubuntu的空间很小 xff0c 导致现在ubuntu系统磁盘容量不够用 于是花了一个3 xff0c 4个小时的时间去完成ubuntu系统的扩容 现在记录一下解
  • 【 Kali 安装教程,有手就会】

    Kali 安装教程 第一步 xff1a 新建一台Debian虚拟机 1 xff09 选择客户机操作系统 2 xff09 设置虚拟机名称 存储位置 3 xff09 设置处理器 1颗1核心 设置内存2048MB 设置网络类型NAT 4 xff0
  • JavaScript表达式与运算符的使用以及if分支结构

    一 表达式与运算符 表达式是对一个或多个变量或值 xff08 操作数 xff09 进行运算 xff0c 并返回一个新值 运算符可以分为一下类别 xff1a 赋值运算符 var a 61 10 var b 61 20 var c 61 a 4
  • 应届生学的 java,转自动化测试拿到 15k 薪资,送给大家的经验积分

    窗外 xff0c 西安的冬天阳光明媚 xff0c 坐在电脑前心情十分平静 想在这个难得的闲暇里 xff0c 想起记录一下自己这些年的经历 xff0c 也是给自己留一点以后可以回忆的故事 个人 2015 年入学 xff0c 武汉某大学计科相关
  • 在VS Code的notebook中编写Rust代码

    目录 背景 前提条件 操作步骤 背景 在VS Code的notebook中编写Rust代码 xff0c 听起来就觉得绕 VS Code已经有Rust插件 xff0c 支持编写Rust代码 xff0c 为什么搞这么复杂 为了综合两者的优点 x
  • Linux内核下gitee的使用

    一 什么是git git是一个开源的分布式版本控制系统 xff0c 用于敏捷高效地处理任何或小或大的项目 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件 Git 与常用的版本控
  • 洛谷 P1786 帮贡排序

    目录 输入 授予职位 输出前按输出规则排序 输出 最后代码 题目是非常长长长长长长长长长长长长长长长长长长长长长长长长长长长长长 我花了2个小时才做完 这题是大模拟 xff08 打磨你 xff09 xff0c 题目也很长 xff0c 需要耐
  • ./nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such

    这个错误提示说明nginx在运行时找不到libpcre so 1这个共享库文件 xff0c 可能是因为系统中没有安装PCRE库或者安装的PCRE库版本不对导致的 解决方法如下 xff1a 确认系统中是否已经安装了PCRE库 xff0c 可以
  • netperf使用指南

    netperf使用笔记 netperf 是一种非常常见的测量网络带宽的工具 xff0c 其安装非常简单 xff1a 1 下载netperf包 2 进入netperf目录 xff0c configure 3 make 4 make insta
  • debian中设置默认声卡

    alsamixer 设置默认声卡 sudo nano etc asound conf 设置声卡1为默认 则写入以下内容 xff1a defaults ctl card 1 defaults pcm card 1 defaults timer
  • zabbix第三方邮箱警告配置

    1 安装postfix软件 root 64 server yum y install postfix Last metadata expiration check 18 30 18 ago on Sun 04 Sep 2022 04 11
  • Python常用基础语法知识点大全合集,看完这一篇文章就够了

    介绍 Python 是一门独特的语言 xff0c 快速浏览一下他的要点 xff1a 面向对象 xff1a 每一个变量都是一个类 xff0c 有其自己的属性 xff08 attribute xff09 与方法 xff08 method xff
  • 删除重复数字的三种方法(详解)

    前言 xff1a 本期是关于去重数字的三种方法详解 xff0c 今天你c了吗 xff1f 输入描述 xff1a 第一行 xff0c 输入一个整数n xff0c 表示序列有n个整数 第二行输入n个整数 xff08 每个整数大于等于1 xff0
  • 【结构体】 结构体引用、结构体数组指针、包含结构的结构体

    目录 一 概念 变量的定义 初识结构体 结构体变量的定义 引用结构体类型的初始化 二 结构体的数组 认识结构体数组 初始化结构体数组 三 结构体指针 初识结构体指针 指向结构体数组的指针 结构体作为函数参数 1 使用结构体变量作为函数参数
  • 【数组的排序方法】 选择法、冒泡法、交换法、插入法、折半法

    目录 前言 一 选择法排序 二 冒泡法排序 三 交换法排序 四 插入法排序 五 折半法排序 前言 我们前面已经了解过数组的理论知识 xff0c 但虽说数组是一个有序的集合 xff0c 但这里的顺序指的是数组元素所在数组中的位置 xff0c