排序算法之冒泡排序 C++和PHP实现

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。是最慢的排序算法。在实际运用中它是效率最低的算法。

时间复杂度:

它是最差时间复杂度为:O(n^2),冒泡排序最好的时间复杂度为:O(n^2),平均时间复杂度为:O(n^2)

算法原理:

1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

3. 针对所有的元素重复以上的步骤,除了最后一个。

4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

算法稳定性:

冒 泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊 地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变, 所以冒泡排序是一种稳定排序算法。

php代码:

<?php
 $n = 8;
 $min = 1;
 $max = 100;
 $data = createData($n, $min, $max);
 echo "随机生成数组:";
 print_r($data);
 echo "<br />";
 bubble_sort($data, $n);

    //生成一个随机数组成的不重复数组
 function createData($n, $min, $max){
     $bigarr = range($min, $max);
  $arrkey = array_rand($bigarr, $n); //返回键名
  for($i=0; $i<count($arrkey); $i++){
      $arr[] = $bigarr[$arrkey[$i]];
  }
  return $arr;
 }

 //冒泡排序函数
 function bubble_sort($data, $n)
 {
  $flag = 0;
  for($i=0; $i<$n-1; $i++){
   for($j=0; $j<$n-$i-1; $j++){
    if($data[$j+1] < $data[$j]){
     $flag = 1;
     $temp = $data[$j];
     $data[$j] = $data[$j+1];
     $data[$j+1] = $temp;
    }
   }
   if (!$flag){
    break;
   }
   $flag = 0;
   echo "排序过程 ".($i+1)." 步:";
   print_r($data);
   echo "<br/>";
  }
  echo "排序后的结果:";
  print_r($data);
 }
?>

运行结果:

c++代码:

#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int createData(int arr[], int n, int min, int max);
void bubble_sort(int *a, int n);
int main()
{
    int arr[100];
    int n=6;
    int min=2;
    int max=12;
    createData(arr, n, min, max);
    for (int i=0; i<n; i++)
        cout << arr[i] << " ";
    cout << endl;
    bubble_sort(arr, n);
    for (int j=0; j<n; j++)
        cout << arr[j] << " ";
    cout << endl;
    return 1;
}
 //生成一个随机数组成的不重复数组
int createData(int arr[], int n, int min, int max)
{
    srand(time(NULL));
    int i,j,flag;
    for(i=0; i<n; i++){
        do{
            int num = min + rand()%(max-min+1);
            arr[i] = num;
            flag = 0;
            for(j=0; j<i; j++){
               if( arr[i] == arr[j])
                   flag = 1;
            }
        }while(flag);
    }
    return 1;
}
 //冒泡排序函数
void bubble_sort(int *a, int n)
{
    bool flag = true;
    int k = n;
    while(flag)
    {
        flag = false;
        for(int i=1; i<k; i++)
        {
            if(a[i-1] > a[i])
            {
                int tmp = a[i];
                a[i] = a[i-1];
                a[i-1] = tmp;
                flag = true;
            }
        }
        k--;
    }
}

运行结果:

时间: 2024-11-05 15:59:35

排序算法之冒泡排序 C++和PHP实现的相关文章

排序算法之冒泡排序Java实现

排序算法之冒泡排序 一.初级的冒泡排序 import java.util.Arrays; /** * * @title BubbleSort * @describe 冒泡排序 * @author 张富昌 * @date 2016年10月1日下午3:56:30 */public class BubbleSortLow { // 起泡排序是快速排序的基础,但是排序速度较慢. // 基本思想:将序列中第 1 个元素与第 2 个元素进行比较,如前者大于后者,则两个元素交换位置,否则不交换: // 再将第

排序算法之冒泡排序(Java)

 冒泡排序即每次遍历.相邻数字间进行比较,前者大于后者进行交换,不断将最大值后移,直至沉至最后位置:算法关键要点在于确定每次循环的边界: 后面两种算法则是对冒泡排序一定程度上的改良,但相对于其他排序算法,冒泡排序性能依然较差. //冒泡排序 public class Bubble_Sort { //最原始的解法 public void bubble_sort1(int[] data) { int n = data.length; for(int i = 0; i < n; i++) { //

java排序算法之 --- 冒泡排序

冒泡排序是我们比较常用的一种排序算法,它的原理是:从头遍历未排好序的序列,每相邻的两个元素进行比较,较大(或较小)的元素放在后面,一轮遍历之后最大(或最小)的元素已经放到最后,然后依次重复之前的步骤把未排好序的序列进行排序,遍历 n-1 轮之后,整个序列就排好序了(第 n 轮不必要,因为第 n-1 轮排序后只剩下最后一个元素).因为这种排序算法每次排好一个元素,就像冒泡一样,所以叫冒泡排序. 举个小例子: arr[] = {6,1,5,3,2,4} 第一趟, 6,1,5,3,2,4  :  1,

我的Java开发学习之旅------&gt;Java经典排序算法之冒泡排序

冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 一.算法原理 冒泡排序算法的运作如下: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 3.

排序算法1——冒泡排序

在介绍冒泡排序之前,优先介绍一种算法设计的策略——蛮力法.这是一种简单直接的解决问题的方法,常常直接基于问题的描述和所涉及的定义.由于蛮力法是基于问题的定义来思考的,那么可以说它是一种几乎什么问题都能解决的一般性的方法.当然,缺点也是显而易见的,那就是“笨”,即解决方法的过程既不巧妙,也不高效.而冒泡排序就是蛮力法在排序问题上的一个典型的应用场景. 所谓冒泡排序,即是对于一个给定长度为n的无序数组,由初始位置开始,比较数组相邻两个元素,如果是逆序排列的,就交换它们的位置,重复多次之后,最大数就“

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

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

排序算法(一)冒泡排序

以前就学过C,最近学的JAVA,感觉不错. 明年研究生了,现在我想复习一下数据结构,都是基础的东西. 先从排序算法开始吧.第一个冒泡排序. public class BubbleSort { public static void sort(int[] a)//简单的冒泡算法. { //static 静态只能调用静态 int temp=0; int SwapSteps=0;//交换的次数 int CompareSteps=0;//比较的次数 int flag=1;//如果排好了,再循环就没用了,怎

排序算法之冒泡排序(Bubble Sort)

基本思想 假如按照从小到大的顺序排序,对待排序数组进行遍历,如果当前值大于其后一个值则进行交换,不断的进行遍历,直到没有交换动作的发生.冒泡排序的最好时间复杂度为O(n),最坏的时间复杂度为O(n2),所以冒泡排序的平均时间复杂度为O(n2),另外冒泡排序不会改变相同元素的前后顺序,故其是一种稳定的排序算法. 实现代码 #include<iostream> using namespace std; int main() { int MyData[10] = { 7,3,12,46,32,64,

排序算法之冒泡排序的两种方式

冒泡排序是排序算法的一种,思路清晰,代码简洁,常被用在大学生计算机课程中. 冒泡排序有两种方式,相邻的两个数比较,把大的数(或者小的数)放在上面,依次进行,像水泡一样,逐渐上浮. 也可以以相反的过程,把较大的数(或者较小的数)放在下面,推入湖底.这两种方式都是冒泡排序,因为冒泡排序是比较相邻的两个数,下标不具有跳跃性,同时也是一种稳定的算法. 方式一:较大的数(或者较小的数)上浮 1 void BubbleSort(int a[], int n) 2 { 3 for(int i=0; i<n-1

排序算法之冒泡排序的思想以及Java实现

1 基本思想 设排序表长为n,从后向前或者从前向后两两比较相邻元素的值,如果两者的相对次序不对(A[i-1] > A[i]),则交换它们,其结果是将最小的元素交换到待排序序列的第一个位置,我们称它为一趟冒泡.下一趟冒泡时,前一趟确定的最小元素不再参与比较,待排序序列减少一个元素,每趟冒泡的结果把序列中最小的元素放到了序列的"最前面". 2,算法的实现(Java) package Algorithm; public class BubleSort { /** * @param ar