冒泡算法

排序算法分析1--冒泡排序、插入排序、选择排序

邮差的信 提交于 2019-12-04 19:07:31
排序算法分析1--冒泡排序、插入排序、选择排序 0.综述 1.冒泡排序(Bubble sort) 1.1冒泡排序算法原理 1.2冒泡排序算法优化与代码实现 1.3冒泡排序算法分析 2.插入排序(Insertion sort) 2.1插入排序算法原理 2.2直接插入排序代码实现 2.3直接插入排序算法分析 2.4折半插入排序算法 3.选择排序(Slection sort) 3.1选择排序算法原理 3.2选择排序代码实现 3.3选择排序算法分析 0.综述 所谓排序,就是将原本无序的序列重新排列成有序序列的过程 。排序算法对任何一个程序员来说都是一项基本功,在实际的项目中我们也经常需要使用排序。排序算法的选择和使用不仅要针对实际数据的特点,有时候排序的稳定性也必须考虑。这样可以提高程序的运行效率,让开发工作事半功倍。 学习排序算法不能仅仅停留在了解算法原理和使用代码实现这两步,我们应该在此基础上学会去分析和评价一个算法 。我们可以从以下几各方面去衡量一个排序算法: 对于排序算法执行效率的分析 ,包括最好、最坏、平均情况下的时间复杂度,算法运行过程中数据比较和交换的次数等。 对于排序算法的内存消耗分析 。算法的内存消耗通过空间复杂度来衡量。 排序算法的稳定性 。所谓稳定性,就是待排序的序列中的值相同的元素经过排序算法处理后是否保持原先的位置关系,若保持,则称这个排序算法为稳定的排序算法

php四种基础算法:冒泡,选择,插入和快速排序法

不问归期 提交于 2019-12-03 11:23:00
许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣。作为一个初级phper,虽然很少接触到算法方面的东西 。但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要掌握的。下面是我按自己的理解,将四个方法分析一遍。 需求:分别用 冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中 的值按照从小到的顺序进行排序。 $arr(1,43,54,62,21,66,32,78,36,76,39); 1. 冒泡排序法 * 思路分析:法如其名,就是像冒泡一样,每次从数组当中 冒一个最大的数出来。 * 比如:2,4,1 // 第一次 冒出的泡是4 * 2,1,4 // 第二次 冒出的泡是 2 * 1,2,4 // 最后就变成这样 $arr=array(1,43,54,62,21,66,32,78,36,76,39); function getpao($arr){ $len=count($arr); //设置一个空数组 用来接收冒出来的泡 //该层循环控制 需要冒泡的轮数 for($i=1;$i<$len;$i++) { //该层循环用来控制每轮 冒出一个数 需要比较的次数 for($k=0;$k<$len-$i;$k++) { if($arr[$k]>$arr[$k+1]) { $tmp=$arr[$k+1]; $arr[$k+1]=$arr[$k];

排序算法之冒泡、插入、快排和选择排序

怎甘沉沦 提交于 2019-12-02 11:14:22
排序算法大全 package cn.baidu; import java.util.Arrays; public class SortTest { public static void main(String[] args) { int[] arr = { 2, 5, 3, 1, 4 }; System.out.println("排序前:" + Arrays.toString(arr)); // InsertSort.sort(arr); // BubbleSort.sort(arr); // SelectionSort.sort(arr); // ShellSort.sort(arr); // QuickSort.sort(arr); // MergeSort.sort(arr); // HeapSort.sort(arr); System.out.println("排序后:" + Arrays.toString(arr)); } /* * 交换数组中的两个元素 */ public static void swap(int[] data, int i, int j) { int temp = data[i]; data[i] = data[j]; data[j] = temp; } } /** * 冒泡排序(稳定) * @param array 冒泡排序(Bubble Sort

php四种基础算法:冒泡,选择,插入和快速排序法

别等时光非礼了梦想. 提交于 2019-12-02 04:32:07
许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣。作为一个初级phper,虽然很少接触到算法方面的东西 。但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要掌握的。下面是我按自己的理解,将四个方法分析一遍。 需求:分别用 冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中 的值按照从小到的顺序进行排序。 $arr(1,43,54,62,21,66,32,78,36,76,39); 1. 冒泡排序法 * 思路分析:法如其名,就是像冒泡一样,每次从数组当中 冒一个最大的数出来。 * 比如:2,4,1 // 第一次 冒出的泡是4 * 2,1,4 // 第二次 冒出的泡是 2 * 1,2,4 // 最后就变成这样 $arr=array(1,43,54,62,21,66,32,78,36,76,39); function getpao($arr) { $len=count($arr); //设置一个空数组 用来接收冒出来的泡 //该层循环控制 需要冒泡的轮数 for($i=1;$i<$len;$i++) { //该层循环用来控制每轮 冒出一个数 需要比较的次数 for($k=0;$k<$len-$i;$k++) { if($arr[$k]>$arr[$k+1]) { $tmp=$arr[$k+1]; $arr[$k+1]=$arr[$k];

从0开始学算法--排序(1.2冒泡排序)

*爱你&永不变心* 提交于 2019-12-01 09:38:36
算法理解:给你长度为n的一个数组a【】,输出n个值,分别为a[0]-a[i](0<=i<n)的最大值 如: 2 1 3 5 4 2      最大值为2 2 1     最大值为2 2 1 3     最大值为3 2 1 3 5    最大值为5 2 1 3 5 4   最大值为5 所以输出应该使2 2 3 5 5 这时候就要用到冒泡排序(不难看出选择排序也可以实现这个功能),冒泡排序的过程如下 2 1 3 5 4 1 2 3 5 4 1 2 3 5 4 1 2 3 5 4 1 2 3 4 5 从第一个数字开始,像一个泡泡一样遇到比自己小的数字就交换位置,可以发现,1.进行到第i位时,数组的第i位就是前i项的最大值,2.进行一次遍历后数组的最大值在数组的末尾。 数组的最大值在数组的末尾是十分友好的,意味着如果进行n次此过程,数组就可以变成有序数组 冒泡排序代码: #include <algorithm> #include <iostream> #include <cstring> #include <vector> #include <cstdio> #include <cmath> using namespace std; const int maxn=1e4+10; int a[maxn]; int main(){ int n; scanf("%d",&n); for(int

常见排序算法详解(冒泡、选择、插入、快速、希尔、归并)

自闭症网瘾萝莉.ら 提交于 2019-11-28 04:07:35
一、排序算法 1、冒泡排序(Bubble Sort) 定义 :是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 原理: 比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 list1 = [12, 54, 23, 56, 67, 45, 1] def bubbleSort(): '''冒泡排序''' for i in range(len(list1) - 1, 0, -1): for j in range(i): if list1[j] > list1[j + 1]: list1[j], list1[j + 1] = list1[j + 1], list1[j] print(list1) bubbleSort() 时间复杂度: 最优时间复杂度:O(n) (表示遍历一次发现没有任何可以交换的元素,排序结束。) 最坏时间复杂度:O(n2) 稳定性:稳定 效果图: 2

排序算法(一)冒泡排序

佐手、 提交于 2019-11-26 17:02:13
最基础的排序——冒泡排序 假设有无序数组array[]长度为n,以由小到大排序为例。冒泡的原理是这样的: 1.比较相邻的前两个数据,如果前面的数据array[0]大于后面的数据array[1] (为了稳定性,等于就不交换),将前面两个数据进行交换。在将计数器 i ++; 2.当遍历完n个数据一遍后,最大的数据就会沉底在数组最后array[n-1]。 3.然后n=n-1;再次进行遍历排序将第二大的数据沉到倒数第二位置上array[n-2]。再次重复,直到n=0;将所有数据排列完毕。 可以得出,冒泡在 n减到 0 为止,每遍近似遍历了n个数据。所以冒泡的时间复杂度是 -O(n^2)。 实现代码如下: public void sort (int[] array, int n) { int i = 0; int j = 0; int temp = 0; for(i = 0; i < n; i++){ for(j = 1; j < n - i; j++){ if(array[j - 1] > array[j]){ temp = array[j-1]; array[j - 1] = array[j]; array[j] = temp; } } } }   时间复杂度逻辑上是-O(n^2),所以冒泡还是效率比较低下的,数据较大时,建议不要采用冒泡。 来源: https://www.cnblogs