C++冒泡排序与选择排序详解

目录
  •  一.冒泡排序
    • 1.概念
    •  2.图解
    • 3.代码的思路
    • 4.代码例子
  •  二.选择排序
    • 1.概念
    • 2.图解
    • 3.代码的思路
  • 总结

 一.冒泡排序

1.概念

冒泡排序这种排序方法其实关键词就在于冒泡两个字,顾名思义就是数字不断比较然后最大的突出来,也就是说把相邻的两个数字两两比较,当一个数字大于右侧相邻的数字时,交换他们的位置,当一个数字和他右侧的数字小于或等于的时候,不交换。

 2.图解

关于冒泡排序我自己画了一幅图来描述他的一轮过程

这里我举了五个无序的数{7,3,6,5,4}

 由此可看出他不断与右侧相邻的数字进行比较,当他大于右边的数字就交换,否则不交换,就用这种方法不断进行排序进行很多轮,最后得出一个有序的序列{2,4,5,6,7}。

3.代码的思路

冒泡循环是一种有序的序列,有上图我们不难看出冒泡循环一轮需要进n-1次比较然后开启下一层,而且你一轮比较完了之后最后一个最大的数就不用再参与比较循环了,所以下一次的循环可以减少一次。

因此我的思路是利用两次for循环,一次循环来当取第二次循环的次数,然后依次减少第二次for循环的次数,简便了很多过程,然后数组两个相邻的数字进行依次比较,大于右边的也就是大于下一位的交换位置,否则不交换,所以我的两个for循环的代码如下(其实这也算是个万能代码,就冒泡循环这一块)当然i,k,b都需要来定义的,n为比较序列中元素个数。

这个代码也用了两次for循环所以我们不难推算出时间复杂度为o(n^2)

for(i=0;i<n-1;i++)
{
 for(k=0;k<n-1-i;k++)
   { if(a[k]>a[k+1])
     { b=a[k];
       a[k]=a[k+1];
       a[k+1]=b;
      }//交换a[k]与a[k+1]位置
     }
 }

4.代码例子

我自己也写了一个代码,输入a[10]序列的数字,然后冒泡循环进行排序来实现

#include<stdio.h>
int main()
{
	int a[10], i, j, b, k;
	for (i = 0; i < 10;i++)
	{
		printf("输入第%d个数为:", i+1);
		scanf_s("%d", &a[i]);
   }
	for (k = 0; k < 9; k++)//外部循环
	   		for (i = 0; i < 9 - k; i++)//内部循环
			if(a[i] > a[i + 1])//
			{
				b = a[i];
				a[i]= a[i + 1];
				a[i + 1] = b;
			}

	printf("排出序列为:");
	for(i = 0; i < 10; i++)
		printf("%d ", a[i]);
	return 0;
}

最后运行也是成功的

 二.选择排序

1.概念

选择循环的主要是选择,选择一个元素去进行比较,假如这个数比他小,换成嘞个数继续比较,最后找出最小值与数组第一位的数进行交换。然后一直这样循环下去,直到代码排序完成。也就是通过一个中间量从带排序的的数中找出最大或最小的交换到对应位置。

2.图解

关于选择排序我自己花了一幅图来描述他的一轮比较

我用了五个无序数来做例子{2,1,4,-3,3}

 由此可以看出选择比较的过程,这里我用指针代指了需要的中间量,刚开始指针指向2,然后2去比较,1<2,所以指针指向较小值,指针指向1,最后就这样找出-3为最小值和第一个交换,得到第一轮循环比较的数列{-3,1,4,2,3}。

3.代码的思路

其实观察上图一轮循环次数还有循环完一轮之后,不需要用最小值比较可以看出其实他和冒泡循环有点相似,都是循环一轮需要进n-1次比较然后开启下一层,而且下一次循环可以减少一次。

所以我的思路是,依然运用两次for循环,与冒泡循环不同的是我需要一个中间商,所以我可以引用一个局部变量来帮助我,这个局部变量就是图解的指针,局部变量就是数组对应元素的位置,不断进行比较,当他小于一个数时,他就等于嘞个数的位置数,继续比较,直到循环结束找出最小值,最小值跟第一位换位置,一次循环直到排出有序序列为止。所以代码如下

for(i=o;i<n-1:i++)//循环数列取得数开始依次比较
{
  int x=i;//x为中间商
  for(k=i+1;k<n;k++)//从循环数列取得数后一位开始循环数列取得数进行依次比较
    {
      if(a[x]>a[k])//得出最小值
        k=x;
        if(x!=i)//将得到的最小值跟最前面的数字进行交换
        { t=a[i];
          a[i]=a[x];
          a[x]=t;
        }
     }
 }

这也是一个万能代码可以用在选择序列上。

总结

到此这篇关于C++冒泡排序与选择排序详解的文章就介绍到这了,更多相关C++冒泡排序 选择排序内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等

    本文实现了八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序 首先是算法实现文件Sort.h,代码如下: /* * 实现了八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 * 以及快速排序.归并排序.堆排序和LST基数排序 * @author gkh178 */ #include <iostream> template<class T> void swap_value(T &a, T &b) { T t

  • C++冒泡排序与选择排序详解

    目录  一.冒泡排序 1.概念  2.图解 3.代码的思路 4.代码例子  二.选择排序 1.概念 2.图解 3.代码的思路 总结  一.冒泡排序 1.概念 冒泡排序这种排序方法其实关键词就在于冒泡两个字,顾名思义就是数字不断比较然后最大的突出来,也就是说把相邻的两个数字两两比较,当一个数字大于右侧相邻的数字时,交换他们的位置,当一个数字和他右侧的数字小于或等于的时候,不交换.  2.图解 关于冒泡排序我自己画了一幅图来描述他的一轮过程 这里我举了五个无序的数{7,3,6,5,4}  由此可看出

  • java冒泡排序和选择排序详解

    目录 1.冒泡排序 2.选择排序法 总结 1.冒泡排序 冒泡排序(Bubble Sorting)的基本思想是:通过对待 排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒. 因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下 来没有进行过交换,就说明序列有序. 图解冒泡排序算法的过程 原始数组:3, 9, -1, 10, 20 第一趟排序 (1) 3, 9, -1, 10, 20 // 如果相邻

  • c++选择排序详解

    选择排序,作为八大经典算法之一,虽不如插入,快速,希尔等排序高效,但其结构简单,思路清晰,适合新手理解算法, 了解排序,适合数据较少时的排序情况. 如下是选择排序的图解原理 如果说冒泡排序是顶向下,那么选择排序就是由底向上了,先解决第一个数,再解决第二个数,依次解决整个数组的排序 如下是全部代码的实现 #include <iostream> #include <math.h>//待会会用到swap交换函数 using namespace std; int main() { int

  • JAVA十大排序算法之选择排序详解

    目录 选择排序 代码实现 动图演示 代码实现 时间复杂度 算法稳定性 总结 选择排序 1.找到数组中最大(或最小)的元素 2.将它和数组的第一个元素交换位置(如果第一个元素就是最大(小)元素那么它就和自己交换) 3.在剩下的元素中找到最大(小)的元素,将它与数组的第二个元素交换位置.如此往复,直到将整个数组排序. 代码实现 对下面数组实现排序:{87, 23, 7, 43, 78, 62, 98, 81, 18, 53, 73, 9} 动图演示 代码实现 public class Selecti

  • java数据结构排序算法之树形选择排序详解

    本文实例讲述了java数据结构排序算法之树形选择排序.分享给大家供大家参考,具体如下: 这里我们就来说说选择类排序之一的排序:树形选择排序 在简单选择排序中,每次的比较都没有用到上次比较的结果,所以比较操作的时间复杂度是O(N^2),想要降低比较的次数,则需要把比较过程中的大小关系保存下来.树形选择排序是对简单选择排序的改进. 树形选择排序:又称锦标赛排序(Tournament Sort),是一种按照锦标赛的思想进行选择排序的方法.首先对n个记录的关键字进行两两比较,然后在n/2个较小者之间再进

  • JS排序之选择排序详解

    本文为大家分享了JS选择排序的具体代码,供大家参考,具体内容如下 说明 时间复杂度指的是一个算法执行所耗费的时间 空间复杂度指运行完一个程序所需内存的大小 稳定指,如果a=b,a在b的前面,排序后a仍然在b的前面 不稳定指,如果a=b,a在b的前面,排序后可能会交换位置 --JS选择排序-- 原理 首先从原始数组中找到最小的元素,并把该元素放在数组的最前面,然后再从剩下的元素中寻找最小的元素,放在之前最小元素的后面,知道排序完毕. 时间复杂度,空间复杂度,稳定性 平均时间复杂度O(n*n) 最好

  • java数据结构与算法之简单选择排序详解

    本文实例讲述了java数据结构与算法之简单选择排序.分享给大家供大家参考,具体如下: 在前面的文章中已经讲述了交换类的排序算法,这节中开始说说选择类的排序算法了,首先来看一下选择排序的算法思想: 选择排序的基本算法思想: 每一趟在 n-i+1 (i=1,2,3,--,n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录. 简单选择排序: 设所排序序列的记录个数为n.i取1,2,-,n-1,从所有n-i+1个记录(Ri,Ri+1,-,Rn)中找出排序码最小的记录,与第i个记录交换.执行n-

  • PHP排序算法系列之直接选择排序详解

    直接选择排序 直接选择排序(Straight Select Sorting) 的基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,-.,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,-..,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列· 选择排序的主要优点与数据移动有关.如果某个元素位于正确的最终位置上,则它不

  • java排序算法之选择排序详解

    本文实例为大家分享了java排序算法之选择排序的具体代码,供大家参考,具体内容如下 选择排序 选择排序的思路是这样的:首先,找到数组中最小的元素,拎出来,将它和数组的第一个元素交换位置,第二步,在剩下的元素中继续寻找最小的元素,拎出来,和数组的第二个元素交换位置,如此循环,直到整个数组排序完成. 至于选大还是选小,这个都无所谓,你也可以每次选择最大的拎出来排,也可以每次选择最小的拎出来的排,只要你的排序的手段是这种方式,都叫选择排序. (有序区,无序区).在无序区里找一个最小的元素跟在有序区的后

  • C语言实现冒泡排序算法的示例详解

    目录 1. 问题描述 2. 问题分析 3. 算法设计 动图演示 4. 程序设计 设计一 设计二 结论 5. 流程框架 6. 代码实现 7. 问题拓展 1. 问题描述 对N个整数(数据由键盘输入)进行升序排列. 2. 问题分析 对于N个数因其类型相同,我们可利用 数组 进行存储. 冒泡排序是在 两个相邻元素之间进行比较交换的过程将一个无序表变成有序表. 冒泡排序的思想:首先,从表头开始往后扫描数组,在扫描过程中逐对比较相邻两个元素的大小. 若相邻两个元素中,前面的元素大于后面的元素,则将它们互换,

随机推荐