PHP常见的几种排序算法

一、冒泡排序

排序原理:对一组数据,比较相邻数据的大小,把小的数据放在前面,值大的放在后面(升序排序)

举例说明: $arr = [6, 3, 8, 2, 9, 1];

第一轮排序:

第一次比较 6和3比较: 3    6   8   2   9   1

第二次比较 6和8比较: 3    6   8   2   9   1

第三次比较 8和2比较: 3    6   2   8   9   1

第四次比较 8和9比较: 3    6   2   8   9   1

第五次比较 9和1比较: 3    6   2   8   1   9

第一轮比较总结:1.排序第1轮、比较5次,没有获得从小到大的排序   2.因为每次比较都是大数往后靠,所以比较完成后,可以确定大数排在最后(9 已经冒泡冒出来了,下轮比较可以不用比较了 )

第二轮排序:

第一次比较 3和6比较: 3    6   8   2   1   9

第二次比较 6和8比较: 3    6   8   2   1   9

第三次比较 8和2比较: 3    6   2   8   1   9

第四次比较 8和1比较: 3    6   2   1   8   9

第二轮比较总结:1.排序第2轮、比较4次,没有获得从小到大的排序   2.冒泡出了 8,下轮不用比较8 了

第三轮排序:

第一次比较 3和6比较: 3    6   2   1   8   9

第二次比较 6和2比较: 3    2   6   1   8   9

第三次比较 6和1比较: 3    2   1   6   8    9

第三轮比较总结:1.排序第3轮、比较3次,没有获得从小到大的排序   2.冒泡出了 6,下轮不用比较6 了

第四轮排序:

第一次比较 3和2比较: 2    3   1   6   8    9

第二次比较 3和1比较: 2    1   3   6   8   9

第四轮比较总结:1.排序第4轮、比较2次,没有获得从小到大的排序   2.冒泡出了 3,下轮不用比较3 了

第五轮比较

第一次比较2和1比较: 1    2   3   6   8    9

第五轮比较总结:1.排序第5轮、比较1次,没有获得从小到大的排序   2.冒泡出了 2,由于还剩一个1,不用再比较了,至此通过5轮排序,完成整个排序

结论:对于一个长度为N的数组,我们需要排序 N-1 轮,每 i 轮 要比较 N-i 次。对此我们可以用双重循环语句,外层循环控制循环轮次,内层循环控制每轮的比较次数。

代码实现:

二、选择排序

原理:在一组数据中,选出最小数与第一个位置的数交换。让胡在剩些的数再找最小的数与第二个位置的数交换,如此类推。

举例说明: $arr = [6, 3, 8, 2, 9, 1];

第一轮:

第一次比较: 第一个数6与3  8  2  9  1中的3比较,最小数为3,位置为1

第二次比较: 第最小数3与3  8  2  9  1中的8比较,最小数为3,位置为1

第三次比较: 第最小数3与3  8  2  9  1中的2比较,最小数为2,位置为3

第四次比较: 第最小数2与3  8  2  9  1中的9比较,最小数为2,位置为3

第五次比较: 第最小数2与3  8  2  9  1中的1比较,最小数为1,位置为5

第一轮比较完成后,确定最小数为1,小于第一个数6,交换位置上的数,交换后结果为 1  3  8  2  9  6

第二轮:

第一次比较: 第一个数3与  8  2  9  6中的8比较,最小数为3,位置为1

第二次比较: 第最小数3与  8  2  9  6中的2比较,最小数为2,位置为3

第三次比较: 第最小数2与  8  2  9  6中的9比较,最小数为2,位置为3

第三次比较: 第最小数2与  8  2  9  6中的6比较,最小数为2,位置为3

第二轮比较完成后,确定最小数为2,小于第二个数3,交换位置上的数,交换后结果为 1  2  8  3  9  6、、

第三轮:

第一次比较: 第一个数8与  3  9  6中的8比较,最小数为3,位置为3

第二次比较: 第最小数3与  3  9  6中的9比较,最小数为3,位置为3

第三次比较: 第最小数2与  3  9  6中的6比较,最小数为3,位置为3

第三轮比较完成后,确定最小数为3,小于第三个数8,交换位置上的数,交换后结果为 1  2  3  8  9  6

第四轮:

第一次比较: 第一个数8与  9  6中的9比较,最小数为8,位置为3

第二次比较: 第最小数8与  9  6中的6比较,最小数为6,位置为5

第四轮比较完成后,确定最小数为6,小于第四个数8交换位置上的数,交换后结果为 1  2  3  6  9  8

第五轮:

第一次比较: 第一个数 9与 8 中的8比较,最小数为8,位置为5

第五轮比较完成后,确定最小数为8,小于第五个数9,交换位置上的数,交换后结果为 1  2  3  6  8  9

综合以上五轮比较,每一轮比较都可以确定一个位置,对于N个数,比较N-1轮可以确定N个位置上的数,因为确定了N-1个位置,最后一个位置也就确定了

代码实现:

三、插入排序

在要排序的一组数中,假设前面的数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序

代码实现:

四、快速排序

从数组第一个元素开始依次确定从小到大的元素

代码实现:

原文地址:http://blog.51cto.com/13716819/2109069

时间: 2024-10-25 12:46:44

PHP常见的几种排序算法的相关文章

Java常见的几种排序算法-插入、选择、冒泡、快排、堆排等

本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排序.快速排序(重点).堆排序.归并排序等等.看下图: 给定数组:int data[] = {9,2,7,19,100,97,63,208,55,78} 一.直接插入排序(内部排序.O(n2).稳定) 原理:从待排序的数中选出一个来,插入到前面的合适位置. [java] view plain copy

常见的几种排序算法-插入、选择、冒泡、快排、堆排等

排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排序.快速排序(重点).堆排序.归并排序等等.看下图: 给定数组:int data[] = {9,2,7,19,100,97,63,208,55,78} 一.直接插入排序(内部排序.O(n2).稳定) 原理:从待排序的数中选出一个来,插入到前面的合适位置. package com.xtfggef.algo.sort; public

常见的8种排序算法

部分转自互联网...... 下面要讲到的8种排序都属于内部排序,既在内存中完成,主要从理论原理方面来分析的.    插入排序 ①直接插入排序 例:六个数12 15 9 20  6 31 24 用直接插入排序,如下图: 思路: 第一步:从给出的六个数中,随便拿出一个数,比如12,形成一个有序的数据序列(一个数当然是有序的数据序列了,不看12之外的数,就当其他的数不存在): 第二步:从剩下的五个数中挑出一个数来,比如15,和刚才的12作比较,12<15,因此,放在12后面,形成数据序列12 15:

常见的几种排序算法

1 #include <stdio.h> 2 3 //直接插入排序算法 4 void InsertSort(int a[], int size) 5 { 6 int i, j; 7 int key; //待插入的值 8 for (j = 1; j < size; j++) 9 { 10 key = a[j]; 11 i = j - 1; 12 while (i >= 0 && a[i]>key) 13 { 14 a[i + 1] = a[i]; 15 i--;

博客一,常见的几种排序算法的Java实现

一.插入排序 算法导论上有很形象的比喻,把插入排序类比成扑克牌,默认你手里本身拥有的第一张是有序的,第二章和第一张对比后决定其位置,以此类推.代码如下: 1 public class InsertSort { 2 public void insertSort(int[] a){ 3 if(a==null||a.length==0||a.length==1){ 4 return ; 5 } 6 //i代表已有序的数组元素的边界, 7 for(int i = 0 ; i<a.length-1 ;i+

整理的8种排序算法的总结和比较

1 快速排序(QuickSort) 快速排序是一个就地排序,分而治之,大规模递归的算法.从本质上来说,它是归并排序的就地版本.快速排序可以由下面四步组成. (1) 如果不多于1个数据,直接返回. (2) 一般选择序列最左边的值作为支点数据. (3) 将序列分成2部分,一部分都大于支点数据,另外一部分都小于支点数据. (4) 对两边利用递归排序数列. 快速排序比大部分排序算法都要快.尽管我们可以在某些特殊的情况下写出比快速排序快的算法,但是就通常情况而言,没有比它更快的了.快速排序是递归的,对于内

常见的五类排序算法图解和实现(多关键字排序:基数排序以及各个排序算法的总结)

基数排序思想 完全不同于以前的排序算法,可以说,基数排序也叫做多关键字排序,基数排序是一种借助“多关键字排序”的思想来实现“单关键字排序”的内部排序算法. 两种方式: 1.最高位优先,先按照最高位排成若干子序列,再对子序列按照次高位排序 2.最低位优先:不必分子序列,每次排序全体元素都参与,不比较,而是通过分配+收集的方式. 多关键字排序 例:将下表所示的学生成绩单按数学成绩的等级由高到低排序,数学成绩相同的学生再按英语成绩的高低等级排序.        第一个关键字是数学成绩,第二个关键字是英

总结N种排序算法及实现

排序算法是一个简单的问题,但在此问题上却有大量的研究!当前的排序算法通常按照如下四个方面进行分类(或是评价): 1.时间复杂度:一个排序算法的理想性能是O(n).一般而言,好的性能O(nlogn),坏的性能O(n2). 2.空间复杂度(内存使用量) 3.稳定性:稳定的排序算法会让原本有相等键值的记录维持原本的相对次序. 4.排序方式:插入.交换.选择.合并等 一.冒泡排序:这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端. 步骤:1.比较相邻的两个元素,如果第一个比第二个大,就

12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用

出处:http://blog.csdn.net/han_xiaoyang/article/details/12163251. 声明:版权所有,转载请注明出处,谢谢. 0.前言 从这一部分开始直接切入我们计算机互联网笔试面试中的重头戏算法了,初始的想法是找一条主线,比如数据结构或者解题思路方法,将博主见过做过整理过的算法题逐个分析一遍(博主当年自己学算法就是用这种比较笨的刷题学的,囧),不过又想了想,算法这东西,博主自己学的过程中一直深感,基础还是非常重要的,很多难题是基础类数据结构和题目的思想综