排序(二)__冒泡排序、简单选择排序和直接插入排序

前面《排序(一)__综述》提到按照算法的复杂度分为简单算法和改进算法两大类,本文主要就简单算法中的冒泡排序、简单选择排序和直接插入排序进行通俗详细的解析。

一、冒泡排序

1、基本概念

冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。(动态图来自维基百科)

2、关键代码(优化之后)

void BubbleSort(SqList *L)

{

int i,j;

Status flag=TRUE;            //flag用作标记,避免已经有序的情况下无意义的循环判断

for(i=1;i<L->length&&flag;i++)//若flag为true则退出循环

{

flag=FALSE;               //初始为false

for(j=L->length-1;j>=i;j--)//j从后往前循环

{

if(L->r[j]>L->r[j+1])

{

swap(L,j,j+1);     //交换L->r[j]和L->r[j+1]的值

flag=TRUE;         //如果有数据交换则为true

}

}

}

}

3、复杂度分析

总的时间复杂度为o(n^2)

二、简单选择排序

1、通俗解释

案例一 对比 案例二
爱炒股票短线,不断买进卖出,想通过差价来实现盈利。但通常频繁操作的人,即使失误不多,也会因为操作的手续费和印花税过高而获利很少。 VS 另一种做股票的人,他们很少出手,只是在不断的观察和判断,等到时机一到果断买进或卖出。
冒泡排序的思想就是不断的进行交换,通过交换完成最终的排序,这和上面一种做股票频繁操作的人类似 VS 案例二中的股票高手一样,排序时找到合适的关键字再做交换并且只移动一次完成相应关键字的排序定位工作,这就是选择排序的基本思想

2、基本定义

简单选择排序法(Simple Selection Sort)就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换。

它的工作原理如下:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

3、关键代码

void SelectSort(SqList *L)

{

int i,j,min;

for(i=1;i<L->length;i++)

{

min=i;//将当前下标定义为最小值下标

for(j=i+1;j<=L->length;j++)//循环之后的数据

{

if(L->r[min]>L->r[j])//如果有小于当前最小值得关键字

min=j;//将关键字下标赋值给min

}

if(i!=min)//若min不等于i说明找到最小值交换

swap(L,i,min);

}

}

4、复杂度分析

总的时间复杂度为o(n^2)

三、直接插入排序

1、引入

扑克玩法就是一边摸牌,一边理牌。一副打乱的同花顺理牌过程就是直接插入排序法。

2、基本概念

基本插入排序的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。

它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

3、关键代码

void InsertSort(SqList *L)

{

int i,j;

for(i=2;i<=L->length;i++)//i从2开始假设已放好位置,后面的牌其实就是插入到它左右侧

{

if(L->r[i]<L->r[i-1])//需要将L->r[i]插入有序表

{

L->r[0]=L->r[i];//设置哨兵 循环终止的判断依据

for(j=i-1;L->r[j]>L->r[0];j--)

L->r[j+1]=L->r[j];//记录后移

L->r[j+1]=L->r[0];//插入到正确位置

}

}

}

4、复杂度分析

时间复杂度为O(n^2)

最后说明:尽管冒泡排序、简单选择排序、直接插入排序的时间复杂度均为O(n^2),但就性能方面有如下特点直接插入排序>简单选择排序>冒泡排序

排序(二)__冒泡排序、简单选择排序和直接插入排序

时间: 2024-08-04 21:08:31

排序(二)__冒泡排序、简单选择排序和直接插入排序的相关文章

常见排序算法导读(3)[简单选择排序]

这一节将介绍简单选择排序(Simple Selection Sort). 在介绍简单排序算法之前,先给出排序的确切定义,并简单介绍一下排序算法的稳定性. 排序的确切定义 假设含有n个对象的序列为{R[0], R[1], ..., R[n-1]}, 其对应的关键字(key)序列为{K[0], K[1], ..., K[n-1]}. 所谓排序, 就是确定0, 1, ..., n-1的一种排列p[0], p[1], ..., p[n-1], 使各个关键字满足如下的非递减(升序)或非递增(降序)关系:

排序 之 冒泡排序 简单选择排序 直接插入排序 希尔排序

排序的基本概念 假设含有n个记录的序列为{r1,r2,--,rn},其相应的关键字分别为{k1,k2,--,kn},需确定1,2,--,n的一种排序p1,p2,--,pn,使其相应的关键字满足kp1≤kp2≤--≤kpn非递减(或非递增)关系,即使得序列称为一个按关键字有序的序列{rp1,rp2,--,rpn},这样的操作就称为排序. 排序的稳定性 假设ki=kj(1≤i≤n,1≤j≤n,i≠j),且在排序前的序列中ri领先于rj(即i<j).如果排序后ri仍领先于rj,则称所用的排序方法是稳定

php排序介绍_冒泡排序_选择排序法_插入排序法_快速排序法

这里我们介绍一些常用的排序方法,排序是一个程序员的基本功,所谓排序就是对一组数据,按照某个顺序排列的过程. 充效率看 冒泡排序法<选择排序法<插入排序法 排序分两大类: 内部排序法 交换式排序法 冒泡法 基本思想: 冒泡排序法 案例: 1234567891011121314151617181920212223242526 //简单的$arr=array(0,5,-1); //现在我们把函数毛片封装成函数,利用以后使用//数组默认传递的是值,不是地址,&是地址符function bubb

排序算法篇--之简单选择排序

简单选择排序,就是执行n-i次比较,然后从n-i+1个数据中选择最小的值,如果最小值不是第i(1=<i<=n)个,则和第i个交换. 1 <?php 2 $arr = array(9,5,4,8,7,6,0,3,2,1); 3 4 /** 5 * 返回经过简单选择排序算法排序后的数组 6 * @param $array array 要进行排序的数组 7 * return array 进过排序后的数组 8 */ 9 function SelectSort($array){ 10 11 for

基础排序算法(冒泡排序,选择排序,插入排序)

最近经常调用api中的排序算法,很少自己写了,有时候也只写写快速排序这些比较快的排序,然而刚开始学排序时用的一些基本的排序算法却有点忘了 正好今天Java老师让我们每个人写个选择排序热热手,趁这个机会再来复习下一些基本的排序好了. 一.冒泡排序(稳定排序) 学编程接触到的第一个排序算法,基本思路就是,给定一个无序数组a0.a1.a2.a3....an; 通过从左到右相邻的元素两两比较,把最大或者最下的数依次放到数组的右边,最后得到有序的序列 public static void maoPao(i

排序算法之一--冒泡排序,选择排序,插入排序

一.排序算法定义 1.排序算法定义 排序算法是一种能将一串数据依照特定顺序进行排列的一种算法 2.六种排序算法理解方式 想象小时候老师给我们按照身高进行排队时用到的方法,脑子里面要浮现老师排身高的场面   以从矮到高进行排序为例 3.稳定性的定义 一个排序算法是稳定的,当有两个相等键值的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前. 二.三种基本排序算法 1.冒泡排序:"移" 把最高的移到最右边 第一次循环,找到最高的那个人放到最右边       方法

常用排序法之一 ——冒泡排序法和选择排序法

语言中,常用的算法有:冒泡排序.快速排序.插入排序.选择排序.希尔排序.堆排序以及归并排序等等.那么从这篇开始,我将分别总结下这几种排序法. 先交代一下,我们将要排序的数组定义为arr[N],即数组arr[]包含N个元素. ## 冒泡排序法(Bubblesort) ## 所谓排序法,就是对一组无序的序列进行有序的排序(从大到小或者从小到大),那么什么叫冒泡排序法,冒泡排序法又是怎么实现数组的有序排列呢. 冒泡排序法的具体实现方法是这样的,从数组的第一个元素`arr[0]`开始,两两比较**(`a

常见排序集合(冒泡排序,选择排序,直接插入排序,二分插入排序,快速排序,希尔排序,归并排序)

一下是一些常见的排序算法: 交换元素(后面算法都有用到): // 交换元素 private static void swap(int[] a, int i, int j) { int temp; temp = a[i]; a[i] = a[j]; a[j] = temp; } 冒泡排序(有优化): // 冒泡排序(优化①,②,③,④) private static void bubbleSort(int[] a) { boolean flag = false;// ①表示整个序列是无序的 for

【Java_Base】常用排序算法:冒泡排序、选择排序、插入排序

冒泡排序比较相邻的元素.如果第一个比第二个大,就交换他们两个.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数.针对所有的元素重复以上的步骤,除了最后一个.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较. 选择排序对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量k来记住他的位置,接着第二次比较,前面“后一个元素”现变成了“前一个元素”,继续跟他的“后一个元素”进行比较如果后面的元素比他要小则用变