排序算法一(直接选择,堆排序,冒泡排序和快速排序)

数据结构学习第10篇 - 排序算法的比较冒泡排序、直接插入排序、选择排序、希尔排序、快速排序、归并排序和堆排序 排序算法的比较 内排序的方法有许多,教材上面提到的有:冒泡排序、直接插入排序、选择排序、希尔排序、快速排序、归并排序和堆排序。请编写一简单应用程序,实现上述提到的各种排序算法。 注意:1.需要输出每一趟排序的中间结果; 2.为方便排序算法的比较,不同排序算法请使用相同数据。 #include <stdio.h> #include <stdlib.h> #inc... 阅读详情

对于一个排序算法来说,一般从如下3个方面衡量算法的优劣:

1.时间复杂度:它主要是分析关键字的比较次数和记录的移动次数

2.空间复杂度:分析排序算法中需要多少辅助内存

3.稳定性:若两个记录A和B的关键字相等,排序前后二者的先后次序没有发生变化就称之为稳定排序

现有的排序算法分为:内部排序和外部排序

内部排序:所有的操作都是在内存中完成的,而外部排序需要借助外部存储器(如磁盘等)

外部排序最常用的方法是多路归并排序,即将原先的文件分解为多个能够一次性装入内存的部分,

分别把每一部分调入内存完成排序,接下来再对多个有序的子文件进行归并排序。

接下来主要介绍内部排序,分为:

选择排序(直接选择和堆排序),交换排序(冒泡和快速),插入排序(直接插入,折半插入和Shell排序),归并排序,基数排序和桶式排序。

本文介绍将介绍选择排序和交换排序

数组元素类DataWrap:flag用来标记相同元素出现的次数,a 表示第一次出现,b表示第二次出现,以此类推,用来测试算法的稳定性

package sort_lyf;

public class DataWrap implements Comparable<DataWrap> {
	int data;
	String flag;
	public DataWrap(int data,String flag){
		this.data = data;
		this.flag = flag;
	}
	public String toString(){
		return data+flag;
	}
	public static void swap(DataWrap[] data, int i, int j) {
		DataWrap temp = data[i];
		data[i] = data[j];
		data[j] = temp;
	}
	@Override
	public int compareTo(DataWrap datawrap) {
		return this.data > datawrap.data ? 1:(this.data == datawrap.data? 0:-1);
	}
}

算法的接口类:ISort(采用策略模式)

package sort_lyf;

public interface ISort {
	public void sort(DataWrap[] data);
}

算法的实现类:

package sort_lyf;
/**
 * @author liyafang 直接选择排序:
 * 程序将记录定位在第一个数据上,拿第一个数据和后边的数据依次比较,
 * 如果第一个数据大于后边的数据,发生交换,这样第一趟下来,就选出
 * 最小的一个元素了,它被排在了第一位,然后在定位第二个数据。
 */
public class DirectSelectSort implements ISort {
	public  void sort(DataWrap[] data) {
		System.out.println("开始进入直接选择排序:");
		int arrayLength = data.length;
		for (int i = 0; i < arrayLength - 1; i++) {// 外层循环需要遍历到倒数第二个元素
			for (int j = i + 1; j < arrayLength; j++) {// 内层循环需要遍历到倒数第一元素
				if (data[i].compareTo(data[j]) > 0) {
					DataWrap.swap(data, i, j);
				}
			}
			System.out.println(java.util.Arrays.toString(data));
		}
		// 存在的问题:在每趟比较过程中,程序一旦发现某个数据比第一
		// 位的数据小,立即交换他们,这增加了交换次数,导致算法效率低下。
	}
}
排序之前:
[21a, 30a, 49, 30b, 16, 9a, 9b, 21b]
开始进入直接选择排序:
[9a, 30a, 49, 30b, 21a, 16, 9b, 21b]
[9a, 9b, 49, 30b, 30a, 21a, 16, 21b]
[9a, 9b, 16, 49, 30a, 30b, 21a, 21b]
[9a, 9b, 16, 21a, 49, 30b, 30a, 21b]
[9a, 9b, 16, 21a, 21b, 49, 30a, 30b]
[9a, 9b, 16, 21a, 21b, 30a, 49, 30b]
[9a, 9b, 16, 21a, 21b, 30a, 30b, 49]
排序之后:
[9a, 9b, 16, 21a, 21b, 30a, 30b, 49]


package sort_lyf;
/**
 * @author liyafang 优化后的直接选择排序算法:
 * 用一个变量记录本趟最小元素的索引,每趟选择
 * 只发生一次交换
 */
public class DirectSelectSortOptimized implements ISort {
	// 
	public void sort(DataWrap[] data) {
		System.out.println("开始进入优化版的直接选择排序:");
		int arrayLength = data.length;
		for (int i = 0; i < arrayLength - 1; i++) {
			int minIndex = i;// 永远保留本躺比较中最小值的索引
			for (int j = i + 1; j < arrayLength; j++) {
				if (data[minIndex].compareTo(data[j]) > 0) {
					minIndex = j;
				}
			}
			if (minIndex != i) {
				DataWrap.swap(data, i, minIndex);
			}
			System.out.println(java.util.Arrays.toString(data));
		}
	}
	// 小结:对于直接选择排序,假如有n项数据,数据交换的次数最多有n-1次
	// 比较次数较多,时间复杂度为O(n*n),空间效率很高为O(1);是不稳定排序。
}
排序之前:
[21a, 30a, 49, 30b, 16, 9a, 9b, 21b]
开始进入优化版的直接选择排序:
[9a, 30a, 49, 30b, 16, 21a, 9b, 21b]
[9a, 9b, 49, 30b, 16, 21a, 30a, 21b]
[9a, 9b, 16, 30b, 49, 21a, 30a, 21b]
[9a, 9b, 16, 21a, 49, 30b, 30a, 21b]
[9a, 9b, 16, 21a, 21b, 30b, 30a, 49]
[9a, 9b, 16, 21a, 21b, 30b, 30a, 49]
[9a, 9b, 16, 21a, 21b, 30b, 30a, 49]
排序之后:
[9a, 9b, 16, 21a, 21b, 30b, 30a, 49]


package sort_lyf;
/**
 * @author liyafang 堆排序:
 * 对于一棵顺序结构的完全二叉树而言,对于索引为k的节点,它的两个子节点的索引分别为2k+1,2k+2,反过来,对于
 * 节点为k的,父节点为(k-1)/2.堆排序的步骤就是重复一下两个步骤:1.建堆   2.拿堆的根节点和最后一个节点交换。
 * 对于包含n个元素的数组,堆排序需要n-1次建堆,建堆从最后一个非叶节点开始,因为只要保证每个非叶子节点的值大
 * 于等于其左右子节点的值。每次建堆的作用就是选出最大值(注意大堆排出来的是升序),实际上也属于选择排序,只
 * 不过堆排序可以通过树形结构保存部分比较结果,可减少比较次数。
 */
public class HeapSort implements ISort {
	public void sort(DataWrap[] data) {
		System.out.println("开始进入堆排序");
		int arrayLength = data.length;
		for (int i = 0; i < arrayLength; i++) {
			buildMaxHeap(data, arrayLength - 1 - i);// 每次建堆完成之后,堆顶元素为第i+1大元素
			DataWrap.swap(data, 0, arrayLength - 1 - i);// 交换堆顶和arrayLength - 1
														// - i元素
			// 交换完成重新再次对其余元素建堆
			System.out.println(java.util.Arrays.toString(data));
		}
	}

	// 对data数组从0到lastIndex建最大堆,选出0到lastIndex索引范围内的最大元素(堆顶元素)
	private void buildMaxHeap(DataWrap[] data, int lastIndex) {
		for (int i = (lastIndex - 1) / 2; i >= 0; i--) {
			int comparingIndex = i;// 当前正在判断的节点
			while ((2 * comparingIndex + 1) <= lastIndex) {// 如果当先节点的左子节点还存在
				int biggerIndex = 2 * comparingIndex + 1;// 左子节点的索引
				if (biggerIndex < lastIndex) {// 如果右子节点存在
					if (data[biggerIndex].compareTo(data[biggerIndex + 1]) < 0) {
						biggerIndex++;
					}
				}
				if (data[comparingIndex].compareTo(data[biggerIndex]) < 0) {
					DataWrap.swap(data, comparingIndex, biggerIndex);
					// 继续判断发生交换的子节点(biggerIndex)是否大于其左右子节点
					comparingIndex = biggerIndex;
				} else {
					break;
				}
			}
		}
	}
	// 小结:对于堆排序算法而言,需要进行n-1次建堆,每次建堆耗时logN,
	// 则时间效率为O(N*logN),空间效率很高为O(1),不稳定排序。
}
排序之前:
[21a, 30a, 49, 30b, 16, 9a, 9b, 21b]
开始进入堆排序
[21b, 30a, 21a, 30b, 16, 9a, 9b, 49]
[9b, 30b, 21a, 21b, 16, 9a, 30a, 49]
[9a, 21b, 21a, 9b, 16, 30b, 30a, 49]
[9a, 16, 21a, 9b, 21b, 30b, 30a, 49]
[9b, 16, 9a, 21a, 21b, 30b, 30a, 49]
[9a, 9b, 16, 21a, 21b, 30b, 30a, 49]
[9b, 9a, 16, 21a, 21b, 30b, 30a, 49]
[9b, 9a, 16, 21a, 21b, 30b, 30a, 49]
排序之后:
[9b, 9a, 16, 21a, 21b, 30b, 30a, 49]
package sort_lyf;

/**
 * @author liyafang 优化版的冒泡法: 
 * 依次比较0和1,1和2,2和3,n-2和n-1的值,如果前者大,就交换
 * 经过第一趟,最大的元素排到了最后,然后进行第二趟... 一旦一
 * 趟冒泡没有发生交换,即可提前结束排序。
 */
public class BubbleSortOptimized implements ISort {
	public void sort(DataWrap[] data) {
		System.out.println("开始进入改进版冒泡排序:");
		int arrayLength = data.length;
		int count = 0;
		boolean IsSwap = false;
		for (int i = 0; i < arrayLength; i++) {
			for (int j = 0; j < arrayLength - 1 - i; j++) {
				if (data[j].compareTo(data[j + 1]) > 0) {
					DataWrap.swap(data, j, j + 1);
					IsSwap = true;
					count++;
				}
			}
			if (!IsSwap) {// 如果某趟没有发生交换,则表明已处于有序状态
				break;
			}
			System.out.println(java.util.Arrays.toString(data));
		}
		System.out.println("总的交换次数:" + count);
	}
	/**
	 * 冒泡排序而言的时间效率是不确定的:最好的情况下,初始数据序列已经处于有序的状态
	 * 执行一趟冒泡即可,做n-1次比较,无需进行任何交换;但在最坏情况下,初始数据序列
	 * 处于完全逆序,算法执行n-1躺冒泡,第i趟做了n-i次比较,执行n-i-1次对象交换,
	 * 此时交换总次数为n(n-1)/2;算法空间效率很高,为O(1); 属于稳定排序;
	 */
}
排序之前:
[21a, 30a, 49, 30b, 16, 9a, 9b, 21b]
开始进入改进版冒泡排序:
[21a, 30a, 30b, 16, 9a, 9b, 21b, 49]
[21a, 30a, 16, 9a, 9b, 21b, 30b, 49]
[21a, 16, 9a, 9b, 21b, 30a, 30b, 49]
[16, 9a, 9b, 21a, 21b, 30a, 30b, 49]
[9a, 9b, 16, 21a, 21b, 30a, 30b, 49]
[9a, 9b, 16, 21a, 21b, 30a, 30b, 49]
[9a, 9b, 16, 21a, 21b, 30a, 30b, 49]
[9a, 9b, 16, 21a, 21b, 30a, 30b, 49]
总的交换次数:18
排序之后:
[9a, 9b, 16, 21a, 21b, 30a, 30b, 49]


package sort_lyf;
/**
 * @author liyafang
 */
public class QuickSort implements ISort{
	public  void sort(DataWrap[] data) {
		System.out.println("开始进入快速排序:");
		subSort(data, 0, data.length - 1);
		System.out.println(java.util.Arrays.toString(data));
	}

	public  void subSort(DataWrap[] data, int start, int end) {
		if (start < end) {
			DataWrap base = data[start];
			// 定一个变量leftIndex,从左边第一个索引开始
			int leftIndex = start;
			// 定一个变量rightIndex,从右边第一个索引开始
			int rightIndex = end + 1;
			// 此处三个while循环用的非常秒,注意体会!
			while (true) {
				// 找出大于分界值的元素的索引,并用leftIndex记录它
				while (leftIndex < end
						&& (data[++leftIndex].compareTo(base) <= 0))
					;
				// 找出小于分界值的元素的索引,并用rightIndex记录它
				while (rightIndex > start
						&& (data[--rightIndex].compareTo(base) >= 0))
					;
				// 如果i<j,交换i、j两处索引的元素
				if (leftIndex < rightIndex) {
					DataWrap.swap(data, leftIndex, rightIndex);
				} else {
					break;// 重复执行以上步骤,直到leftIndex>=rightIndex,
				}
			}
			// 最后将分界值和rightIndex索引处的元素交换即可
			DataWrap.swap(data, start, rightIndex);
			// 递归左子序列
			subSort(data, start, rightIndex - 1);
			// 递归右子序列
			subSort(data, rightIndex + 1, end);
		}
	}
	/**
	 * 快速排序的时间效率很好,因为它每趟能确定的元素呈指数增长。 
	 * 快速排序需要使用递归,而递归使用栈,因此它的空间效率为O(logN)。
	 * 快速排序包含跳跃式交换,因此是不稳定的排序。
	 */
}
排序之前:
[21a, 30a, 49, 30b, 16, 9a, 9b, 21b]
开始进入快速排序:
[9a, 9b, 16, 21a, 21b, 30b, 30a, 49]
排序之后:
[9a, 9b, 16, 21a, 21b, 30b, 30a, 49]


Main函数:

package sort_lyf;

public class Test {
	public static void main(String args[]) {
		//a 代表该元素第一次出现  代表该元素第二次出现,主要是为了测试排序是否稳定
		DataWrap[] data = { new DataWrap(21, "a"), new DataWrap(30, "a"),
				new DataWrap(49, ""), new DataWrap(30, "b"),
				new DataWrap(16, ""), new DataWrap(9, "a"),
				new DataWrap(9, "b"), new DataWrap(21, "b"), };
		/*
		 * DataWrap[] data = { new DataWrap(10, "a"), new DataWrap(9, "a"), new
		 * DataWrap(8, ""), new DataWrap(7, "b"), new DataWrap(6, ""), new
		 * DataWrap(5, "a"), new DataWrap(4, "b"), new DataWrap(3, "b"), new
		 * DataWrap(2, "b"), new DataWrap(1, "b")};
		 */
		/*
		 * DataWrap[] data = { new DataWrap(1, "a"), new DataWrap(2, "a"), new
		 * DataWrap(3, ""), new DataWrap(4, "b"), new DataWrap(5, ""), new
		 * DataWrap(6, "a"), new DataWrap(7, "b"), new DataWrap(8, "b"), new
		 * DataWrap(9, "b"), new DataWrap(10, "b")};
		 */
		System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
		/*ISort lyf = new DirectSelectSort();
		lyf.sort(data);
		ISort lyf = new DirectSelectSortOptimized();
		lyf.sort(data);
		ISort lyf = new HeapSort();
		lyf.sort(data);
		ISort lyf = new BubbleSortOptimized();
		lyf.sort(data);*/
		ISort lyf = new QuickSort();
		lyf.sort(data);
		System.out.println("排序之后:\n" + java.util.Arrays.toString(data));
	}
}




 
























        
排序算法: 冒泡排序, 快速排序,希尔排序,直接插入排序 ,直接选择排序,归并排序,堆排序 几种排序算法分析:     冒泡排序:   冒泡排序的方法排序速度比较慢。   思路:进行n-1排序,第一次排序先找出最小的数字,放在第一个位置,然后在剩余的数字中再找出最小的数字,放在第二个位置上,依次类推,可以排出所有的数字。   当然也可以从大到小的排序。   例如 a[]={5 ,4 ,3, 2, 1};         void maopao(int a[] ,int 阅读详情

相关推荐

排序算法(直接插入、折半插入、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序

冒泡法的基本思路是,如果要对 n 个数进行冒泡排序,那么要进行 n-1 趟比较,在第 1 趟比较中要进行 n-1 次两两比较,在第 j 趟比较中要进行 n-j 次两两比较。选择排序的基本算法是从待排序的区间中经过选择和交换后选出最小的数值存放到 a[0] 中,再从剩余的未排序区间中经过选择和交换后选出最小的数值存放到 a[1] 中,a[1] 中的数字仅大于 a[0],依此类推,即可实现排序。//递归一调用merge_sort()函数将r[p+l]〜r[n]归并成有序的t[p+l]〜t[n]

2401_87555402的博客 587

DataWrap

public class DataWrap implements Comparable<DataWrap>{ int data; String flag; public DataWrap(int data,String flag){ this.data = data; this.flag = flag; } public Str

ITBOY_ITBOX博客 1151

AI赋能传染病建模:从数据到动力学模型的本地实践指南

这次我们来看一个将 AI 与传染病动力学建模结合的前沿方向。想象一下,你手头有一份流感爆发的病例数据,传统的建模方法可能需要复杂的微分方程和大量的手动调参,而 AI 模型能否直接从数据中“学习”出传播规律,甚至自动跑通整个建模流程?这正是当前研究的热点。根据《Nature》的最新综述,人工智能正在重塑传染病流行病学建模,从参数推断、趋势预测到多源数据融合,AI 技术为解决传统建模中的计算瓶颈和数据难题提供了全新路径。 对于开发者、数据科学家或公共卫生领域的研究者而言,最关心的是:这套方法能不能在本地跑起来?

weixin_29051811的博客 298

Java方法的参数传递机制详解

本文是读 李刚 编写的 《疯狂Java讲义》中的5.2.2节的读书笔记的整理; Java里的参数传递类似于《西游记》里的孙悟空,孙悟空复制一个假的孙悟空,这个假孙悟空具有和真孙悟空相同的能力,可除妖或被砍头,但不管这个假孙悟空遇到什么事,真孙悟空不会受到任何影响。与此类似,传入方法的是实际参数值得复制品,不管方法中对这个复制品如何操作,实际参数值本身不会受到任何影响 ---李刚

ManagementAndJava的博客 840

Globus数据下载全攻略:从零配置到批量下载大文件(附常见问题解决)

本文详细介绍了Globus数据下载的全流程,从零配置到批量下载大文件的实用技巧,包括环境准备、高级传输策略、性能优化及常见问题解决方案。Globus作为科研数据的高效传输工具,通过并行流传输和自动校验技术,显著提升大规模数据传输的效率和可靠性。

u9v0w的博客 662

Dify 部署与使用

本文介绍了Dify社区版的快速部署指南,涵盖系统架构、环境配置和初始化流程。Dify采用微服务架构,通过Docker Compose一键部署8个核心容器,包括前端、后端、数据库等组件。部署过程包括克隆代码、配置环境变量和启动服务,首次启动需3-10分钟下载镜像。文章详细讲解了.env文件的配置要点,包括服务地址、数据库连接和向量存储设置,并提供了生产环境安全加固建议。最后通过访问/install页面完成管理员账号初始化,即可开始使用Dify构建AI应用。

海兰 591

常用排序算法概述

排序算法 1. 排序算法的介绍 排序也称排序算法(Sort Algorithm),排序是将一组数据,依照指定的顺序进行排列的过程。 2. 冒泡排序 基本思想 通过对待排序序列从前向后(从下标较小的元素开始) ,依次比较相邻元素的值, 若发现逆序则交换, 使值较大的元素逐渐从前移向后部, 就象水底下的气泡一样逐渐向上冒。 代码实现 /** * @param arr 待排序的数组 */ public static void bubbleSort(int[] arr) { // 冒泡排序 的时

大梁学编程 279

宇树G1嵌入式软件架构及技术实现

该架构通过硬件加速(FPGA)+确定性调度(RTX5)的组合,在1ms控制周期内完成从传感器采集到43轴输出的全链路处理,相比波士顿动力系统缩短40%的着地稳定时间。,结合ARM Cortex-R5与FPGA的异构计算能力,实现43自由度1kHz实时控制。

m0_60674045的博客 4311

【数据结构】七种常见排序算法详解(直接插入、希尔、选择、冒泡、快速,归并、堆排序)

一、什么是排序? 【1】排序:就是将一组杂乱无章的数据按照一定的规律(升序或降序)组织起来。 数据表:待排序数据元素的有限集合。 排序码:通常数据元素有多个属性域,其中有一个属性域可用来区分元素,作为排序依据,该域 即为排序码。 如果在数据表中各个元素的排序码互不相同,这种排序码称为主排序码。 按照主排序码进行排序,排序的结果是唯一的。 按照次排序码进行排序,排序的结果可能是不唯一的。...

dai_wen的博客 3954

(建议收藏)2024最新 URL Scheme大全APP跳转界面地址更新中 ios快捷指令快捷方式链接跳转微信小程序必备autojs可用免root (可定制开发和提取URL Scheme 参数提取)

(建议收藏)2024最新 URL Scheme大全APP跳转界面地址更新中 ios快捷指令快捷方式链接跳转微信小程序必备autojs可用免root (可定制开发和提取URL Scheme 参数提取)

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1万+

YOLO26 电子产品零部件质检:缺陷检测 + Streamlit

YOLO26s 电子质检链路:1100 张工业零部件图 (4 类缺陷) → 增强 (blur+shear+低光照) → 150 epoch → mAP@0.5=0.91 → Streamlit 质检界面 (上传/摄像头双模式) → 缺陷严重度分级 (pass/minor/major/critical)。核心贡献:blur+shear 模拟产线振动和视角偏移, 使模糊场景 recall 从 72% 提升至 78%;Streamlit 一键部署, 无需前端经验。建议先收集 200 张纯正常件做负样本防过检;

m0_71589036的博客 374

数据结构 八大排序之冒泡排序与堆排序

八大排序之冒泡排序与堆排序

Mi-ronin的博客 2454

FPGA实现LVDS接口(1)--IBUFDS原语、OBUFDS原语和IOBUFDS原语的介绍及使用(仿真/源码)

通过本文您会学到:Xinlix的源语IBUFDS、OBUFDS和IOBUFDS是什么?

孤独的单刀 2万+

排序算法(直接插入、折半插入、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数类排序)

目录 一、概述 二、算法复杂度 三、插入类排序 1.直接插入排序 2.折半插入排序 3.希尔排序 四、交换类排序 1.冒泡排序 2.快速排序 五、选择类排序 1.简单选择排序 2.堆排序 六、归并排序 1.二路归并排序 七、基数排序 1.基数...

xjtuse123的博客 1万+

SAP FICO应付票据平台开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

SAP FICO应付票据平台开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

我好像病了的博客 378

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C语言 各种排序算法实现(冒泡排序/快速排序/ 直接选择排序/堆排序/归并排序)

各种排序算法实现(冒泡排序/快速排序/ 直接选择排序/堆排序/归并排序) #include <stdio.h> #include <stdlib.h> #define Max 100 typedef struct { int key; }RecType; typedef RecType SeqList[Max+1]; int n; void InsertSort(SeqList R) { int i,j; for(i=2;i<=n;i++)

MS_SONG的博客 540

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

常用排序算法总结(直接插入排序、选择排序、冒泡排序、堆排序、快速排序、希尔排序、归并排序)

本篇文章总结了直接插入排序、选择排序、冒泡排序、堆排序、快速排序、希尔排序、归并排序,包括其实现思路、特点、代码等

m0_74910646的博客 4182

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【数据结构】详解七大排序算法(直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序、快速排序)

arr[n-1]已经排好序,此时用arr[i]待排序的值与前面的数进行比较,找到插入的位置,将arr[i]插入,原来位置上的元素依次向后移动。把待排序的数按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所以的记录插入完为止,得到一个新的有序序列。把堆顶数据和最后一个数据进行交换,把最后一个数不看做堆里面的,相当于n-1个数,向下调整,选出次大的数。每次从待排序的数列中选出最小(或最大)的一个元素,存放在数列的起始位置,直到全部待排序的元素排完。1、R停住,L遇到R,相遇的位置就是R停住的位置。

Hush_H的博客 6400

排序算法(直接插入、冒泡排序、选择排序、快速排序、希尔排序、堆排序、归并排序)

main函数 int main() { int data[] = {1,2,6,3,4,7,7,9,8,5}; //bubble_sort(data,10); //select_sort(data,10); Insert_Sort(data,10); for(int i = 0; i &lt; 10; i++) cout &lt;&lt;...

feixi7358的博客 2360

八大排序算法(直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序,计数排序)

八大排序算法(直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序,计数排序)

代码铺子 8688

C语言实现基本排序算法----排序(直接插入排序,SHELL排序,冒泡排序,快速排序,简单选择排序,堆排序)

//C语言程序----排序(直接插入排序,SHELL排序,冒泡排序,快速排序,简单选择排序,堆排序)//调试成功运行#include "iostream"#include "stdlib.h"#include "stdio.h"#include "malloc.h"typedef struct{int key;int otherinfo;}Redsize;typedef struct{ Redsize r[100];int length;}Sqlist;Sqlist L;int n;int LT(int x

逆风飞扬 4299

C语言实现常见排序算法(直接插入排序,希尔排序,堆排序,选择排序,冒泡排序,快速排序,归并排序)

思想:直接插入排序的思想就是从end+1的位置(也就是第二个元素的位置)往后比较,如果后一个元素比前一个元素大,就把后一个元素往前移,因为是从第二个元素的位置开始,所以当执行到else时,即代表后面有序,所以无论是在if中停止还是在else中停止,最后的a[end+1] 都是key保存的正确位置(因为end放的第一个元素的下标,进入if代表往后移了,往前移end就--,那么end就是被移动的元素的位置,座椅所以加一是正确位置)。这里注意不能直接排序放到原数组中,这样可能会导致覆盖。大概就是这样子的思想。

lhit3的博客 834

【详解八大排序算法】直接插入排序||希尔排序(缩小增量排序)||直接选择排序||堆排序||冒泡排序||快速排序||归并排序||计数排序

本篇将讲述常用的排序算法,包括直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序,使用动图解释,并且画图阐明了递归的写法,同时实现了与非递归的写法复杂度和稳定性分析等等,看完绝对不亏!!!

进一步有一步的欢喜 4349

常见排序算法(算法思想+算法图解+特性总结+代码实现):直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序

一、插入排序 1.直接插入排序 1.1 算法思想: 每次从待排序的数列中按顺序拿出一个数,在已经排好序的有序序列中比对其大小,插入到对应位置,形成一个新的有序序列,全部插入完毕后形成的有序序列就是排好序的序列。 1.2 算法图示: 1.3 特性总结: 1. 元素集合越有序,时间效率越高 2. 时间复杂度:O(N^2) 3. 空间复杂度:O(1) 4. 稳定性:稳定 ...

qq_43109561的博客 1232

排序算法汇总(选择排序 ,直接插入排序,冒泡排序,希尔排序,快速排序,堆排序)

=============================================== 作者:rerli 时间:2003-12-15 目的:重温经典排序思想,并用C语言指针实现排序算法 ================================================ */ /* ================================

老狼的专栏 698

数据结构与算法:七种排序算法总结(冒泡排序、选择排序、直接插入排序、希尔排序、堆排序、归并排序、快速排序)

最近复习了一些排序算法,在这进行一个总结。

dabusideqiang的专栏 3457
上一篇: 多线程陷阱(所有静态初始化块中的代码不一定是类初始化操作)
下一篇: 从程序员到技术总监,分享10年开发经验
方方
博客等级 码龄15年 6粉丝 7原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值