冒泡排序以及遇到一个关于数组一大一小的问题

冒泡排序

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。

冒泡排序算法的运作如下:(从后往前)

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

l  依次比较相邻的两个元素,消除逆序(逆序是数学上的概念,是成对出现的,比如50,30就是一对逆序,所谓的消除逆序,就是大的放后面,小的放前面)

l  这样,一轮比较下来,最大的那个数一对是在最后面!

l  然后,再继续新的一轮的比较,注意,刚才一轮后的最大值不再参与比较,这样,这一轮参与比较的数值就比上一轮少一个,如此反复,直到最后只剩下两个数值比较为止!

所以是一个双重循环,外层控制轮数,内层控制每轮比较的次数。

如果数组有n个元素,一共需要比较n-1轮,也就是外循环的次数!

补充一个其他知识点:

list — 把数组中的值赋给一些变量 ,从小到大,反过来赋值从大到小

下面说一下我写的冒泡排序,以及注释我自己对它的理解:

//冒泡排序,让数组从小到大依次排序
function maopao($arr){
    //双层循环,外层控制,$i代表循环的轮数,比较轮数等于数组的个数减1,$i<$len相当于数组个数-1,例如8个,当$i=7是最后的比较,符合8-1=7;
    for($i=1,$len=count($arr);$i<$len;$i++){
        //内层控制每一轮比较的次数,$k=下标,每一轮比较完最后一个将不再参与比较,下标从0开始
        for($k=0;$k<$len-$i;$k++){
            //比较相邻的两个数,如果前面的数值比后面的大就调换下位置,通过中间数,如果不比它大,则不用调换
            if($arr[$k]>$arr[$k+1]){
                //调换位置
                $tem=$arr[$k];
                $arr[$k]=$arr[$k+1];
                $arr[$k+1]=$tem;
            }
        }
    }
    return $arr;
}
$arr1=array(45,85,12,22,36,7,75,15,40,64);
// echo count($arr1);
echo ‘<pre>‘;
print_r(maopao($arr1));

效果:实现了数组从小到大的排序

如果要实现从大到小,也是一样的算法,都是通过中间数的比较进行交换。

接下来说一说我在面试遇到的一个问题:取一个数组,让这个数组按第一个最大,第二个最小,第三个第二大,第四个第二小…这样进行排序。

当时我只想到好像有个

array_pop:将数组的最后一个数据弹出

array_shift:从数组的前面弹出数据

那让数组从大到小排序后,弹出第一个就拿到最大的,弹出最后一个就拿到最小的,把这两个放一起就一个最大一个最小,再继续进行这样的取出,直到取完所有。

最让我开心,欣慰的是面我的技术老大肯定了我的逻辑是可以的,高兴了好几天….

回去我就去尝试我这个可不可行,下面我就说下我自己试的这个方法

举例:

所以第一步:我是先让数组进行通过冒泡进行从大到小的排序

第二步,我是通过递归把弹出来的第一个(最大)和最后一个(最小)放一起,再进行取出,直到取完为止。

效果:

这个有更好的方法,我这里说的是我当时刚好想到的那个方法,哈,莫见怪,望吐槽。

时间: 2024-10-03 13:38:48

冒泡排序以及遇到一个关于数组一大一小的问题的相关文章

编写冒泡排序,排序一个整形数组

冒泡法:对于n个数进行从小到大冒泡排序,一共需要冒泡n-1次.两两进行比较,每冒泡排序一次,最大值在最下边(最后一个位置). 比如: 87 12 56 45 78 87和12交换:12 87 56 45 78 87和56交换:12 56 87 45 78 87和45交换:12 56 45 87 78 87和78交换:12 56 45 78 87 到此第一趟排序结束,接下来的每一趟排序都是这样. 代码如下: #include<stdio.h> #include<stdlib.h> v

【C语言】编写冒泡排序,排序一个整形数组。

#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> int main() {  int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };  int len = sizeof(arr)/sizeof(arr[0]);  int i = 0;  int j = 0;  for (; i < len - 1; i++)  {   for (j=0; j 

c语言:编写冒泡排序,排序一个整形数组(从小到大)

程序:不妨按从小到大排序 #include <stdio.h> int main () { int a[10]; int i = 0; int j = 0; int t = 0; printf ("input 10 numbers:"); for ( i = 0; i < 10; i++) { scanf ("%d",&a[i]); } for (i = 0; i < 9; i++) for ( j = 0; j < 9 - i

输入5个学生的名字(英文),使用冒泡排序按从大到小排序。 提示:涉及到字符串数组,一个字符串是一个一维字符数组;一个 字符串数组就是一个二维字符数组。

#include <stdio.h>#include <string.h> /*输入5个学生的名字(英文),使用冒泡排序按从大到小排序.提示:涉及到字符串数组,一个字符串是一个一维字符数组:一个字符串数组就是一个二维字符数组.*/ void main(){ char stuNames[5][100]; char tmp[100]; int i = 0,j = 0; for(i = 0; i < 5; i++) { printf("请输入第%d个学生的名字:"

定义一个数字数组,用冒泡排序降序输出

public class M{ int[] array = {2,3,6.5.89.4.1.6}; int b = array.length; int temp = 0; for(int i=0;i<b;i++){ for(int j=i+1;j<b;j++){ if(array[i]>array[j]){ temp = a[i]; a[j] = a[i]; a[j] = temp; } } } System.out.print("array元素的降序排序:"); f

冒泡排序--通过冒泡算法让数组中最大的值成为数组中最后一个值

var nums = [];//定义一个空数组 for(var i=0;i<5;i++){//要用户输入五个数字,就循环5次 nums[i] = parseInt(prompt('请输入数字'));//使用for循环,prompt提示的方法提示用户输入数字 } console.log('用户输入的是:'); console.log(nums);//打印出用户输入的全部数字 for(var i=0;i<nums.length-1;i++){ for(var j=0;j<nums.lengt

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字的最小的一个

/** * @Version 1.0.0 * 输入一个正整数数组,把数组里所有数字拼接起来排成一个数, * 打印能拼接出的所有数字的最小的一个.例如输入{3,32,321,4},则打印最小的数字是 * 321323 * * 其实就是一次排序,只是比较大小的方式与数值比较有所不同 * 这里采用冒泡排序的方式 */public class Pro33 { @MyAnswer public static void f(int array[]){ for(int i=0;i<array.length-1

软件工程课程作业(四)--返回一个整数数组中最大子数组的和

伙伴链接:http://www.cnblogs.com/haoying1994/ 一.设计思想 本实验要求输入一个正负数混合的整型数组,长度不限,在此数组的所有子数组中找到和最大的数组,并求出相应数组的和,且时间复杂度为O(n).我们在课堂上共同讨论了多种解决方案,这些将在下面可能的解决方案中展示,在听了同学的思路和老师的讲解之后, 我们最终选取了老师课堂上描述的比较简便的思路.如下: 在输入数组的环节,采用for无限循环加if判断截止,直到触发回车键为止,将数组记录到Array中,数组长度记录

课后实验4--返回一个整数数组中最大子数组的和

伙伴链接:http://www.cnblogs.com/chengqiqin07/ 一.设计思想 本实验要求输入一个正负数混合的整型数组,长度不限,在此数组的所有子数组中找到和最大的数组,并求出相应数组的和,且时间复杂度为O(n).我们在课堂上共同讨论了多种解决方案,这些将在下面可能的解决方案中展示,在听了同学的思路和老师的讲解之后, 我们最终选取了老师课堂上描述的比较简便的思路.如下: 在输入数组的环节,采用for无限循环加if判断截止,直到触发回车键为止,将数组记录到Array中,数组长度记