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

数据结构学习第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

数学分析五领域全景:实分析、复分析、泛函分析、傅里叶分析、凸分析

五种分析,五种视角,同一个目标。理解一个系统,首先要找到它的不变量。

li880862的博客 192

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

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

ManagementAndJava的博客 840

COMSOL新手必看:锂电池仿真从入门到精通的5个实战案例(附模型文件)

本文为COMSOL新手提供锂电池仿真的5个实战案例,涵盖锂枝晶生长模拟、电池热失控预警、SOC估计等效电路模型、电池组液冷系统热管理及SOH衰退模型构建。通过详细步骤和参数设置,帮助用户快速掌握锂电池仿真技术,提升新能源研发效率。附模型文件可直接应用。

wdx01234567的博客 260

Fanuc机器人的坐标变换矩阵的研究2

一、Funuc用户坐标系的介绍 二、用户坐标系与世界坐标系的坐标转换 三、 以用户坐标系1为基础旋转变换后的用户坐标系 四、关于点的WPR的含义 4.1:点在用户坐标系和世界坐标系下的坐标关系 4.2 通过转换矩阵返回去推导WPR

qq_34047402的博客 1524

常用排序算法概述

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

大梁学编程 279

多智能体强化学习论文——SEAC(NIPS 2020)

存在的问题&研究动机&研究思路 在稀疏奖励的环境下,多智能体的exploration存在效率不足等问题。 在IAC的基础上尝试加入重要性采样,使得每次更新智能体iii的参数时,不再仅仅使用智能体iii的数据,而是使用所有智能体的数据进行智能体iii数据的更新。 对于原始的IAC算法是on-policy的,而SEAC则是off-poligy的。 创新点 在每个智能体iii的actoriactor_iactori​和criticicritic_icritici​的更新过程中,都加入了重要性

我的AI笔记 1206

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

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

dai_wen的博客 3954

【Linux命令大全】006.网络通讯之write命令(实操篇)

Linux write命令摘要 write是Linux系统中用于用户间实时通讯的命令工具,允许向其他登录用户的终端发送消息。主要功能包括: 基本使用:通过write username向指定用户发送消息,Ctrl+D结束输入 终端指定:当用户登录多个终端时,可用write username tty指定目标终端 实用技巧: 使用who查看在线用户 通过管道发送单行消息:echo "内容" | write user 支持多行消息发送和简单聊天会话。

yuhuasheng1997的博客 213

Nacos 从困惑到蒙圈(9)Nacos 适配 达梦数据库【最新版】

介绍Nacos适配达梦数据库的详细步骤,包括对最新版本的支持改造。

甘蓝的专栏 1376

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

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

Mi-ronin的博客 2454

【目标跟踪】多目标跟踪的评价工具motmetrics怎么使用?

多目标跟踪,通过motmetrics测试评价对应的视频。

聿默的博客 5368

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

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

xjtuse123的博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

m0_74910646的博客 4182

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

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、付费专栏及课程。

余额充值