冒泡排序(Bubble Sort):

2024-04-21 19:36
文章标签 冒泡排序 sort bubble

本文主要是介绍冒泡排序(Bubble Sort):,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历待排序序列,依次比较相邻的两个元素,如果顺序不正确就交换它们,直到整个序列有序为止。

基本思想:

  1. 从头开始遍历待排序序列,比较相邻的两个元素,如果顺序不正确就交换它们,这样一轮遍历下来,最大的元素就会被交换到序列的末尾。
  2. 然后对剩下的元素(除去已经有序的部分)重复上述过程,直到整个序列有序。
  3. 时间复杂度:O(n^2)。

  4. 稳定性:稳定。

特点:

  • 简单直观,易于理解和实现。
  • 稳定性:冒泡排序是一种稳定的排序算法,相等元素的顺序在排序前后不会改变。
  • 时间复杂度:最好情况下为O(n),最坏情况下为O(n^2),平均情况下为O(n^2)。

 举例说明: 考虑待排序序列:[5, 3, 8, 4, 2]

第一轮遍历:

  • 比较5和3,顺序正确,不交换,序列变为[3, 5, 8, 4, 2]
  • 比较5和8,顺序正确,不交换,序列不变
  • 比较8和4,顺序不正确,交换,序列变为[3, 5, 4, 8, 2]
  • 比较8和2,顺序不正确,交换,序列变为[3, 5, 4, 2, 8]

第一轮遍历结束,最大的元素8已经移动到序列的末尾。接下来进行第二轮遍历,重复上述过程。

冒泡排序虽然简单,但是效率较低,特别是对于大规模数据的排序。

 用C语言实现示例:

#include <stdio.h>// 冒泡排序函数
void bubbleSort(int arr[], int n) {// 外层循环控制轮数,共需要 n-1 轮for (int i = 0; i < n - 1; i++) {// 内层循环控制每一轮的比较和交换// 每一轮将当前最大的元素交换到末尾for (int j = 0; j < n - i - 1; j++) {// 如果前面的元素比后面的元素大,则交换它们if (arr[j] > arr[j + 1]) {// 交换 arr[j] 和 arr[j+1]int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}int main() {int arr[] = { 5, 3, 8, 4, 2 };int n = sizeof(arr) / sizeof(arr[0]);printf("原始数组:");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");bubbleSort(arr, n);printf("排序后数组:");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}

 用C++实现示例

#include <iostream>
#include <vector>// 冒泡排序函数
void bubbleSort(std::vector<int>& arr) {int n = arr.size();// 外层循环控制轮数,共需要 n-1 轮for (int i = 0; i < n - 1; i++) {// 内层循环控制每一轮的比较和交换// 每一轮将当前最大的元素交换到末尾for (int j = 0; j < n - i - 1; j++) {// 如果前面的元素比后面的元素大,则交换它们if (arr[j] > arr[j + 1]) {// 交换 arr[j] 和 arr[j+1]std::swap(arr[j], arr[j + 1]);}}}
}int main() {std::vector<int> arr = {5, 3, 8, 4, 2};std::cout << "原始数组:";for (int num : arr) {std::cout << num << " ";}std::cout << std::endl;bubbleSort(arr);std::cout << "排序后数组:";for (int num : arr) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

这篇关于冒泡排序(Bubble Sort):的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/923866

相关文章

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

stl的sort和手写快排的运行效率哪个比较高?

STL的sort必然要比你自己写的快排要快,因为你自己手写一个这么复杂的sort,那就太闲了。STL的sort是尽量让复杂度维持在O(N log N)的,因此就有了各种的Hybrid sort algorithm。 题主你提到的先quicksort到一定深度之后就转为heapsort,这种是introsort。 每种STL实现使用的算法各有不同,GNU Standard C++ Lib

冒泡排序——基于Java的实现

简介    冒泡排序(Bubble Sort)是一种简单的排序算法,适用于小规模数据集。其基本思想是通过重复遍历待排序的数组,比较相邻的元素并交换它们的位置,以此将较大的元素逐步“冒泡”到数组的末尾。算法的名称源于其运行过程中,较大的元素像水中的大气泡一样逐渐浮到顶部。  排序过程   for (int i = 0; i < num.length - 1; i++) {

BubbleSort(冒泡排序)

平均时间 复杂度 最差时间 复杂度 最佳时间 复杂度 空间复杂度 O(n^2) O(n^2) O(n) O(1) 稳定 public static void bubbleSort( int[] arr ) {if( arr == null | arr.length < 2 ) {return;}for( int j = arr.length - 1; j > 0;

冒泡排序【BubbleSort】

冒泡排序 假设初始的数组是[5,4,7,2] 以从小到大排序为例: 将第0个元素与第一个元素进行比较, 5 > 4, 所以交换位置, 此时[4,5,7,2] 将第1个元素与第二个元素进行比较, 5 < 7, 所以保持,此时[4,5,7,2] 将第2个元素与第三个元素进行比较, 7 > 2, 所以交换位置, 此时[4,5,2,7] 这样就经过了一轮的冒泡,最后一个元素就是最大的元素了。

C/C++经典排序问题,sort函数使用

目录 1. 前言 2. 正文 2.1 问题 2.2 解决办法 2.2.1 思路 2.2.2 代码实现 2.2.3 测试结果 3. 备注 1. 前言 大家在学习C语言的时候,是不是经常被排序算法折磨的很难那首,其实都是但是在C++中有专门的,排序函数,而且支持自定义排序算法。下面我就带大家看看,sort函数简单的数组排序中的应用。 2. 正文 2.1 问题 题目描述

冒泡排序和鸡尾酒排序(code)

昨天回顾了下冒泡排序和鸡尾酒排序,用面向对象的方式写了一下,并且优化了代码,记录一下~ 一、冒泡排序 # 冒泡排序class BubbleSort(object):def __init__(self, data_list):self.data_list = data_listself.length = len(data_list)# 简单粗暴的排序方式def b_sort(self):d

Hive中order by,sort by,distribute by,cluster by的区别

一:order by order by会对输入做全局排序,因此只有一个Reducer(多个Reducer无法保证全局有序),然而只有一个Reducer,会导致当输入规模较大时,消耗较长的计算时间。关于order by的详细介绍请参考这篇文章:Hive Order by操作。 二:sort by sort by不是全局排序,其在数据进入reducer前完成排序,因此,如果用sort

list.sort实现根据对象的属性值对集合进行排序

list.sort实现根据对象的属性值对集合进行排序,如下所示List<Map<String,Object>> list = new ArrayList<>();Map<String,Object> map1 = new HashMap<>();map1.put("gz_id",1);map1.put("aaa","aaa");Map<String,Object> map2 = new H

HDU 1890 Robotic Sort

题意: 将一列数字排序  排序规则是  每次找到最小值的位置loc  将1~loc所有数字颠倒  然后删掉第一位  直到排好序  排序要求是稳定的 思路: 这题要做的是  寻找区间最小值位置  翻转区间  的操作  因此可以想到用splay 只需要每个节点记录一个small  就可以实现找到最小值位置 翻转区间操作就是将splay的超级头转到最上面使之成为根  再把loc转到根下面