浅薄的应试八大排序速记

菜菜又来啦,这次是要期末考了 随便写点可能不正确的理解

适用于已经至少看过一遍完整知识的 怕忘记来巩固的

完整版请移步b站大学

时间复杂度

浅薄的应试八大排序速记_第1张图片

排序

冒泡排序

两层循环 每次都遍历相邻的元素 如果前面的大于后面的 就交换

	//假设有一个大小为10的数组 
	int a[10];
	for(int i=0;i<10;i++)
	{
		cin>>a[i];
	}
	//两层循环遍历 
	for(int i=1;i<=9;i++)
	{
		for(int j=1;j<=10-i;j++)
		{
			if(a[j]>a[j+1])//如果前一个大于后一个 就交换 
			{
				int temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
		}
	}

选择排序

每次从待排序的序列中找最小的那个元素,把这个元素和该序列第一个元素交换

举个栗子

假设我们有一个数组:5,3,6,2,10,我们要对这个数组进行升序排序。

  1. 第一轮:从整个数组中找到最小的元素,这里是2。把2和数组的第一个元素交换位置。交换后的数组是 2,3,6,5,10
  2. 第二轮:现在,从第二个元素开始到数组的末尾(3, 6, 5, 10),找到最小的元素,这里是3(它已经在正确的位置,所以不需要交换)。
  3. 第三轮:从第三个元素开始到数组末尾(6, 5, 10),找到最小的元素,这里是5。与第三个位置的元素交换,交换后的数组是 2,3,5,6,10。
  4. 第四轮:从第四个元素开始到数组末尾(6, 10),找到最小的元素,这里是6(它已经在正确的位置)。
  5. 最后,数组已经完全排序:2,3,5,6,10。

插入排序

若前n-1个元素已经排好序了,那么就把第n个元素和前面的元素一个个对比,放到第一个比他小的元素后面

举个栗子

比如,有一排卡片,数字分别是4,3,5,1。我们要用插入排序来排列它们。

  • 开始时,假设第一张卡片4已经是“排序好的”。
  • 然后我们拿出下一张卡片3,发现它应该在4前面,所以我们把3插入到4前面,变成3,4,5,1。
  • 接下来拿出5,发现它已经在正确的位置,所以序列还是3,4,5,1。
  • 最后拿出1,我们需要把1插入到正确的位置,即序列的开始。所以最终的排序结果是1,3,4,5。

插入排序就像是整理卡片,每次拿一张新卡片,然后找到它在已排序卡片中的正确位置并插入。这个过程一直进行,直到所有的卡片都排好序。

快速排序

首先拿两个箭头指着这个序列的头和尾 然后把第一个元素作为基准 先拿出来 那第一个箭头就空了 把第二个箭头指着的元素和基准比 若比基准小 就把这个元素放到第一个箭头的位置 然后第一个箭头往后移一位 再把第一个箭头指着的元素和基准对比 比基准小就不动 箭头后移 否则放到第二个箭头指的空的位置 以此类推(总之就是箭头有指着的元素就和基准比 然后看大小 放到箭头指着的空的地方)

举个栗子

比如,你有一组数字 7,2,1,8,67,2,1,8,6,你要用快速排序来排序。

  • 首先,选择一个数字作为基准,比如说7。
  • 然后,把小于7的数字放在一边(2,1,62,1,6),把大于7的数字放在另一边(88)。现在排列是这样的:2,1,6,7,82,1,6,7,8。
  • 接下来,对2,1,62,1,6和88这两组分别进行相同的操作。比如在2,1,62,1,6中选择2作为基准,得到1,2,61,2,6。
  • 继续这个过程,直到每组都是有序的。

最终,整个序列变得有序:1,2,6,7,81,2,6,7,8。

快速排序就像是一个不断分组和细化的过程,每次都通过选择一个基准来将一组数字分成两部分,直到所有的数字都被正确地排列。这是一个非常高效的排序方法,特别适合处理大量数据。

希尔排序

选择一个间隔,然后隔着这个间隔的两个数比较 进行交换 小的放前面

然后不断缩小这个间隔 到最后间隔为1

举个栗子

选择的数字是 24,13,9,64,7,23,34,47。

  1. 选择初始间隔:首先,我们需要选择一个初始间隔。对于这8个元素的数组,我们可以选择间隔为4。

  2. 第一轮排序:按照间隔4,我们将数组分为两组进行插入排序。第一组是24,7,第二组是13,23,第三组是9,34,第四组是64,4764,47。排序这些小组后,数组变为 7,13,9,47,24,23,34,64。

  3. 减小间隔:接下来,我们减小间隔。假设我们现在选择间隔为2。

  4. 第二轮排序:按照间隔2,数组被分为4组:7,9,24,34、13,47,23,64。排序这些组后,数组变为 7,13,9,23,24,47,34,64。

  5. 最后一轮,间隔为1:最后,我们进行常规的插入排序,间隔为1。此时,由于前面的步骤,数组已经部分排序,所以这一步将会更快更高效。

  6. 完成排序:进行最后一轮的插入排序后,我们得到最终排序好的数组:7,9,13,23,24,34,47,64。

在这个例子中,通过先用较大间隔进行排序,然后逐渐减小间隔,希尔排序有效地将整个数组分成了小部分,使得最终的插入排序变得更加高效。

归并排序

想象一下你正在整理一堆杂乱无章的漫画书,你的任务是按照它们的系列号码顺序排列好。

归并排序的过程:

  1. 分成小组:首先,你把这一大堆漫画书分成两半,然后再将每半分成更小的组,一直这样分下去,直到每个小组只有一本书或没有书。

  2. 合并小组:现在,你开始合并这些小组。每次合并,你都会比较两个小组中的书,并按顺序把它们放在一起。这样,小组里的书就会按照系列号码有序排列。

  3. 重复合并:继续合并更大的组,直到最后所有的小组都合并成了一组,而且里面的书都是有序的

基数排序

准备十个桶 编号0-9 从个位数开始按照该位上的数的大小放进桶里排序

举个栗子

比如,你有一组数字 170,45,75,90,802,24,2,66,你要用基数排序来排序。

  • 首先,按个位数字排序并收集:170,90,802,2,24,45,75,66(因为个位上数字的顺序是0, 0, 2, 2, 4, 5, 5, 6)。
  • 然后,按十位数字排序并收集:802,2,24,45,66,170,75,90(因为十位上数字的顺序是0, 0, 2, 4, 6, 7, 7, 9)。
  • 接着,按百位数字排序并收集:2,24,45,66,75,90,170,802(因为百位上数字的顺序是0, 0, 0, 0, 0, 0, 1, 8)。
  • 在这个例子中,我们只需要排序到百位,因为802是最大的数字。

最终,通过基数排序,这组数字被排序成 2,24,45,66,75,90,170,802。

基数排序特别适合于对长度相同的数字进行排序,效率很高,但它也需要额外的空间来存放临时的桶和数据。

堆排序

这个比较抽象 建议看视频

想象你有一堆乱序的数字,就像一堆玩具块,你需要按大小顺序排列它们。堆排序的过程就像是用这些玩具块建造一个金字塔,然后一步步拆解它,以达到排序的目的。

  1. 建造最大堆:首先,把所有的数字(玩具块)建造成一个最大堆。这个过程就像是把最大的块放在顶部,确保每个块都比它下面的块大。

  2. 排序:一旦最大堆建立完成,堆的顶部(金字塔的顶端)就是最大的元素。你把它从堆中移除,放到数组的末尾。这就像是从金字塔顶端拿走最大的块,并把它放到一边。

  3. 重建最大堆:移除顶部元素后,把剩下的元素重新调整为最大堆。这就像是重新调整剩下的块,确保顶部是最大的。

  4. 重复过程:重复这个过程,每次都从堆顶取出最大的元素,放到数组的正确位置,然后重建最大堆,直到所有元素都被移除并排序。

举个栗子

假设有一组数字 4,10,3,5,1,我们要用堆排序来排序。

  • 建造最大堆:首先,将数组转换成最大堆。转换后可能得到 10,5,3,4,1(其中10是最大的,位于顶部)。

  • 排序:移除堆顶的10,将其放到数组的末尾。现在数组变成了 1,5,3,4,10

  • 重建最大堆:除去已排序的部分(10),剩下的部分 1,5,3,4重建为最大堆,可能得到 5,4,3,1

  • 重复过程:继续这个过程,再次移除堆顶的5,放到数组的末尾(前一个最大值的前面),然后重建最大堆,以此类推。

  • 完成排序:重复这个过程直到所有元素都被移除并排序,最终得到排序好的数组 1,3,4,5,10

不知道大家看懂没有 反正我看懂了#^#

你可能感兴趣的:(排序算法,算法)