基于比较的排序---选择、插入、冒泡

初学排序时,也比较模糊,多是照猫画虎,不能透彻理解。今天对几种简单的排序的做一小结。日后继续学习、总结更多地、性能更优的排序!

一、选择排序

先把代码贴上

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int a[9] = {5,7,4,6,1,9,3,2,8};
 5     int len = sizeof(a)/sizeof(int);
 6     int i,j,min,temp,m;
 7     for(i = 0; i < len; i++)
 8     {
 9         min = i;
10         for(j = i+1; j < len; j++)
11         {
12             if(a[min] > a[j])
13             {
14                 min = j;
15             }
16         }
17
18         if(min != i)
19         {
20             temp = a[min];
21             a[min] = a[i];
22             a[i] = temp;
23         }
24     }
25
26     for(m = 0; m <len; m++)
27     {
28         printf("%d ",a[m]);
29     }
30
31     return 0;
32
33 }

此处以升序为例

如下图所示,对该数组进行升序排序

选择排序的原理其实很简单,就是用一个变量min始终保存当前未排序序列的最小元素下标。当外层的第一次循环结束后,比较一下参加该次循环的下标是否和当前的min一致,如果一致,则不管,如果不一致交换两个下标对应元素的位置。

下面针对这段话结合上图做一分析:

第一趟:在比较之前,先定义min用来保存当前最小元素的下标。

a[min]分别和a[i+1](a[j])比较,第一次a[0](5)和a[1](7)比较,a[0]小,继续,j++,接着a[0]和a[2]比较,a[0]大,则把当前j值的赋给min,即min = 2; 因为min保存的是当前最小元素下标,现在发现有人比他小了,就要更新自身的值了。那么现在就是用a[2]和a[3]比较了,a[2]小,继续j++。a[2]和a[4]比,a[4]小。更新min的值为4,j++。继续用a[4]和a[5]比,a[4]小,j++。一直比较a[8],发现都是a[4]小,则第一趟比较结束。得出最小元素的下标为4。

然后用外层第一次进入循环的i值和min比较,如果不相等,说明这个i对应的元素不是最小元素,那么就和min下标对应的元素互换位置,将最小元素置于数组首位了。

第二趟:此时的i等于2了,min也重新被初始为2,继续让a[min]和a[i+1]比较,步骤和第一趟的完全相同,这趟下来,又可以找到最小元素的角标。

接下来就是重复这个步骤了。

具体过程如下图:

二、直接插入排序

先贴代码

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int a[5] = {5,7,4,6,3};
 5     int len = sizeof(a)/sizeof(int);
 6     int i,j,temp,m;
 7     for(i = 1; i < len; i++)
 8     {
 9         if(a[i] < a[i-1])
10         {
11             temp = a[i];
12
13             for(j = i-1; j >= 0 && a[j] > temp; j--)
14             {
15                 a[j+1] = a[j];
16             }
17             a[j+1] = temp;
18         }
19     }
20     for(m = 0; m < len; m++)
21     {
22         printf("%d ",a[m]);
23     }
24     return 0;
25 }

话都在图里了:

三、冒泡排序

贴代码:

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int a[5] = {5,6,3,7,4};
 5     int i,j,k,temp;
 6     int len = sizeof(a)/sizeof(int);
 7
 8     for(i = 0; i < len - 1; i++)
 9     {
10         bool flag = true;
11         for(j = 0; j < len - i - 1; j++)
12         {
13             if(a[j] > a[j+1])
14             {
15                 temp = a[j];
16                 a[j] = a[j+1];
17                 a[j+1] = temp;
18                 flag = false;
19             }
20
21         }
22         if(flag)
23         {
24             break;
25         }
26     }
27
28     for(k = 0; k < len; k++)
29     {
30         printf("%d ",a[k]);
31     }
32     return 0;
33 }

上图:

如图所示,针对数组元素为5,6,3,7,4进行了冒泡排序,每次比较相邻的两个元素,若前者大于后者,则互换,反之,不换,继续往后推进。但可以发现,在进行完三次冒泡之后,已经产生了最终结果:3,4,5,6,7。但程序并不会因此停止,它仍会继续执行两轮,进行最后两次的冒泡,但这是没有意义的。所以在代码中增加了标志flag的设定,如果没有比较了,就不再执行操作,就可以认为,当前序已按照要求序列排列完毕!

总结:

    简单选择排序:

    基本思想为每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为数组首元素,直到所有元素排完为止,简单选择排序是不稳定排序。时间复杂度为O(n2)。

    直接插入排序:

    基本思想为每一步将一个待排序的记录,插入到前面已经排好序的有序序列中,直到插完所有元素为止。时间复杂度为O(n2)。

    冒泡排序:

    基本思想为对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序。时间复杂度依然为O(n2

原文地址:https://www.cnblogs.com/mvcq/p/8669052.html

时间: 2024-10-09 07:42:21

基于比较的排序---选择、插入、冒泡的相关文章

排序算法(一)3种简单排序(选择,冒泡,插入)

排序是数据处理中十分常见且核心的操作,虽说实际项目开发中很小几率会需要我们手动实现,毕竟每种语言的类库中都有n多种关于排序算法的实现.但是了解这些精妙的思想对我们还是大有裨益的.本文简单温习下最基础的三类算法:选择,冒泡,插入. 先定义个交换数组元素的函数,供排序时调用 /** * 交换数组元素 * @param arr * @param a * @param b */ public static void swap(int []arr,int a,int b){ arr[a] = arr[a]

数据结构与算法 4:排序算法,选择/插入/冒泡/希尔/快速/归并

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] 排序算法 平均复杂度 冒泡排序    O(n2) 选择排序     O(n2) 插入排序     O(n2) 希尔排序     O(n1.5) 快速排序    O(N*logN) 归并排序     O(N*logN) 堆排序     O(N*logN) 基数排序     O(d(n+r)) 选择排序: [email protected]://990487026.blog.51cto.com~/sort$ c

三大基本排序--选择、冒泡、插入

引言: 老师已经是第三次跟我们讲排序了,可想而知排序它的重要性,这三种基本排序的方式值得我们思考和研究,理解其中的思想. 简述: 概念: 将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序 常见排序算法: 快速排序.希尔排序.堆排序.直接选择排序不是稳定的排序算法,而基数排序.冒泡排序.直接插入排序.折半插入排序.归并排序是稳定的排序算法. 选择排序: 原理: 将初始序列(A[0]~A[n-1])作为待排序序列,按照从小到大进行排序,假设现在A[0]是最小的,将剩余的元素与其进行

常见排序算法(冒泡、选择、插入、快速、归并C++实现)

常见排序算法(冒泡.选择.插入.快速.归并C++实现) #include <iostream> using namespace std; // 冒泡排序 void bubbleSort (int data[], size_t size) { for (size_t i = 0; i < size - 1; ++i) { bool ordered = true; for (size_t j = 0; j < size - 1 - i; ++j) if (data[j+1] <

js排序算法总结——冒泡,快速,选择,插入,希尔,归并

相信排序是任何一个程序猿都会用到的东西,今天简单总结记录下常见的排序算法. 一.冒泡排序 说起冒泡排序,可能每个人都不会陌生,实现思路相当简单明了,就是不停的对数组进行两两比较,将较大(较小)的一项放在前面: 如 var arr = [7, 3, 10, 1, 8, 4, 2, 4, 4, 3] 进行升序排列,排序过程如下 第一次 [3, 7, 1, 8, 4, 2, 4, 4, 3, 10] 第二次 [3, 1, 7, 4, 2, 4, 4, 3, 8, 10] 以此类推 .... 结果 [1

冒泡 选择 插入 希尔 堆 归并 快速 排序算法

排序相关概念 排序:对一序列对象根据某个关键字进行排序: 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面: 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面: 内排序:所有排序操作都在内存中完成: 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行: 排序耗时的操作:比较.移动: 排序分类: (1)交换类:冒泡排序.快速排序:此类的特点是通过不断的比较和交换进行排序: (2)插入类:简单插入排序.希尔排序:此类的特点是通过插入的

简单排序:插入,选择和冒泡

void selectsort(int a[],int n) // 选择排序的思路就是每次找到当前序列中最小的元素,然后交换 { // 就是选择最小的,然后交换 int i,j,flag; for(i = 0;i<n;i++) { flag = i; //当前元素 for(j = i+1;j<n;j++) { if(a[j]<a[flag]) flag = j; //在剩下未排序的数组中找到最小元素的下标 } int temp = a[i]; //交换当前元素和最小元素. a[i] =

python 数据结构与算法之排序(冒泡,选择,插入)

目录 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 数据结构与算法: 算法: 数据结构 冒泡排序法 选择排序法 插入排序法 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 计算机重要的几门课: 1.数据结构和算法 2.网络 3.操作系统 4.计算组成原理 数据结构与算法: 算法: 衡量算法的标准: 时间复杂度:就是程序代码执行的大概次数 小结: 时间复杂度是用来估计算法运行时间的一个式子(单位) 一般来说,时间复杂度高的算法比复杂度低的算法慢 常见的

排序算法-(冒泡、选择、插入算法)

运行效率较慢的三大排序算法:冒泡.选择与插入算法,时间复杂度都为O(n2),运行效率较慢. #python 代码实现如下所示: li=[2,1,4,5,7,8,9,5,3]#冒泡算法(升序算法)O(n2)import randomfrom cal_time import *@cal_timedef bubble_sort(li): for i in range(len(li)-1): #第i趟 exchange=False for j in range(len(li)-i-1): #无序区域为n