努力尽今夕,少年犹可夸。这篇文章主要讲述冒泡排序相关的知识,希望能为你提供帮助。
冒泡排序是最简单的排序算法,它通过重复交换相邻元素(如果它们的顺序错误)来工作。
示例:
第一遍:
( 5 1 4 2 8 ) –>
( 1 5 4 2 8 ),这里,算法比较前两个元素,并从 5 >
1 开始交换。
( 1 5 4 2 8 ) –>
( 1 4 5 2 8 ), 交换自 5 >
4
( 1 4 5 2 8 ) –>
( 1 4 2 5 8 ), 交换自 5 >
2
( 1 4 2 5 8 ) –>
( 1 4 2 5 8), 现在,由于这些元素已经是有序的 (8 >
5),算法不会交换它们。
第二遍:
(1 4 2 5 8) - >
(1 4 2 5 8)
(1 4 2 5 8) - >
(1 2 4 5 8),交换自从4>
2
(1 2 4 5 8) - >
(1 2 4 5 8)
(1 2 4 5 8)–>
(1 2 4 5 8)
现在,数组已经排序了,但是我们的算法不知道它是否完成了。该算法需要一整遍没有任何交换才能知道它已排序。
第三遍:
(1 2 4 5 8) - >
(1 2 4 5 8)
(1 2 4 5 8) - >
(1 2 4 5 8)
(1 2 4 5 8) - >
(1 2 4 5 8 )
( 1 2 4 5 8 ) –>
( 1 2 4 5 8 )
以下是冒泡排序的实现。
```c++
// C++ program for implementation of Bubble sort
#include <
bits/stdc++.h>
using namespace std;
void swap(int xp, int yp)
{
int temp = xp;
xp = yp;
yp = temp;
}
// A function to implement bubble sort
void bubbleSort(int arr[], int n)
{
int i, j;
for (i = 0;
i <
n-1;
i++)
// Last i elements are already in place
for (j = 0;
j <
n-i-1;
j++)
if (arr[j] >
arr[j+1])
swap(&
arr[j], &
arr[j+1]);
}
/ Function to print an array /
void printArray(int arr[], int size)
{
int i;
for (i = 0; i < size; i++)
cout < < arr[i] < < " " ;
cout < < endl;
}
// Driver code
int main()
{
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr)/sizeof(arr[0]);
bubbleSort(arr, n);
cout< < " Sorted array: \\n" ;
printArray(arr, n);
return 0;
}
```c
// C program for implementation of Bubble sort
#include <
stdio.h>
void swap(int *xp, int *yp)
{
int temp = *xp;
*xp = *yp;
*yp = temp;
}// A function to implement bubble sort
void bubbleSort(int arr[], int n)
{
int i, j;
for (i = 0;
i <
n-1;
i++)// Last i elements are already in place
for (j = 0;
j <
n-i-1;
j++)
if (arr[j] >
arr[j+1])
swap(&
arr[j], &
arr[j+1]);
}/* Function to print an array */
void printArray(int arr[], int size)
{
int i;
for (i=0;
i <
size;
i++)
printf("%d ", arr[i]);
printf("\\n");
}// Driver program to test above functions
int main()
{
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr)/sizeof(arr[0]);
bubbleSort(arr, n);
printf("Sorted array: \\n");
printArray(arr, n);
return 0;
}
// java program for implementation of Bubble Sort
class BubbleSort
{
void bubbleSort(int arr[])
{
int n = arr.length;
for (int i = 0;
i <
n-1;
i++)
for (int j = 0;
j <
n-i-1;
j++)
if (arr[j] >
arr[j+1])
{
// swap arr[j+1] and arr[j]
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}/* Prints the array */
void printArray(int arr[])
{
int n = arr.length;
for (int i=0;
i<
n;
++i)
System.out.print(arr[i] + " ");
System.out.println();
}// Driver method to test above
public static void main(String args[])
{
BubbleSort ob = new BubbleSort();
int arr[] = {64, 34, 25, 12, 22, 11, 90};
ob.bubbleSort(arr);
System.out.println("Sorted array");
ob.printArray(arr);
}
}
# python program for implementation of Bubble Sortdef bubbleSort(arr):
n = len(arr)# Traverse through all array elements
for i in range(n):# Last i elements are already in place
for j in range(0, n-i-1):# traverse the array from 0 to n-i-1
# Swap if the element found is greater
# than the next element
if arr[j] >
arr[j+1] :
arr[j], arr[j+1] = arr[j+1], arr[j]# Driver code to test above
arr = [64, 34, 25, 12, 22, 11, 90]bubbleSort(arr)print ("Sorted array is:")
for i in range(len(arr)):
print ("%d" %arr[i]),
```c#
// C# program for implementation
// of Bubble Sort
using System;
class GFG
{
static void bubbleSort(int []arr)
{
int n = arr.Length;
for (int i = 0; i < n - 1; i++)
for (int j = 0; j < n - i - 1; j++)
if (arr[j] > arr[j + 1])
{
// swap temp and arr[i]
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
/* Prints the array */
static void printArray(int []arr)
{
int n = arr.Length;
for (int i = 0;
i <
n;
++i)
Console.Write(arr[i] + " ");
Console.WriteLine();
}// Driver method
public static void Main()
{
int []arr = {64, 34, 25, 12, 22, 11, 90};
bubbleSort(arr);
Console.WriteLine("Sorted array");
printArray(arr);
}
}
```php
<
?php
// PHP program for implementation
// of Bubble Sortfunction bubbleSort(&
$arr)
{
$n = sizeof($arr);
// Traverse through all array elements
for($i = 0;
$i <
$n;
$i++)
{
// Last i elements are already in place
for ($j = 0;
$j <
$n - $i - 1;
$j++)
{
// traverse the array from 0 to n-i-1
// Swap if the element found is greater
// than the next element
if ($arr[$j] >
$arr[$j+1])
{
$t = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $t;
}
}
}
}// Driver code to test above
$arr = array(64, 34, 25, 12, 22, 11, 90);
$len = sizeof($arr);
bubbleSort($arr);
echo "Sorted array : \\n";
for ($i = 0;
$i <
$len;
$i++)
echo $arr[$i]." ";
?>
<
script>
function swap(arr, xp, yp)
{
var temp = arr[xp];
arr[xp] = arr[yp];
arr[yp] = temp;
}// An optimized version of Bubble Sort
function bubbleSort( arr, n)
{
var i, j;
for (i = 0;
i <
n-1;
i++)
{
for (j = 0;
j <
n-i-1;
j++)
{
if (arr[j] >
arr[j+1])
{
swap(arr,j,j+1);
}
}}
}/* Function to print an array */
function printArray(arr, size)
{
var i;
for (i=0;
i <
size;
i++)
document.write(arr[i]+ " ");
document.write("\\n");
}// Driver program to test above functions
var arr = [64, 34, 25, 12, 22, 11, 90];
var n = 7;
document.write("UnSorted array: \\n");
printArray(arr, n);
bubbleSort(arr, n);
document.write("Sorted array: \\n");
printArray(arr, n);
<
/script>
输出:
文章图片
优化实现:
即使数组已排序,上述函数也始终运行 O(n^2) 时间。如果内循环没有引起任何交换,则可以通过停止算法来优化它。
```c++
// Optimized implementation of Bubble sort
#include < bits/stdc++.h>
using namespace std;
void swap(int xp, int yp)
{
int temp = xp;
xp = yp;
yp = temp;
}
// An optimized version of Bubble Sort
void bubbleSort(int arr[], int n)
{
int i, j;
bool swapped;
for (i = 0; i < n-1; i++)
{
swapped = false;
for (j = 0; j < n-i-1; j++)
{
if (arr[j] > arr[j+1])
{
swap(& arr[j], & arr[j+1]);
swapped = true;
}
}
// IF no two elements were swapped by inner loop, then break
if (swapped == false)
break;
}
}
/ Function to print an array /
void printArray(int arr[], int size)
{
int i;
for (i = 0; i < size; i++)
cout < < " " < < arr[i];
cout < < " n" ;
}
// Driver program to test above functions
int main()
{
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr)/sizeof(arr[0]);
bubbleSort(arr, n);
cout < < " Sorted array: \\n" ;
printArray(arr, n);
return 0;
}
```c
// Optimized implementation of Bubble sort
#include <
stdio.h>
#include <
stdbool.h>
void swap(int *xp, int *yp)
{
int temp = *xp;
*xp = *yp;
*yp = temp;
}// An optimized version of Bubble Sort
void bubbleSort(int arr[], int n)
{
int i, j;
bool swapped;
for (i = 0;
i <
n-1;
i++)
{
swapped = false;
for (j = 0;
j <
n-i-1;
j++)
{
if (arr[j] >
arr[j+1])
{
swap(&
arr[j], &
arr[j+1]);
swapped = true;
}
}// IF no two elements were swapped by inner loop, then break
if (swapped == false)
break;
}
}/* Function to print an array */
void printArray(int arr[], int size)
{
int i;
for (i=0;
i <
size;
i++)
printf("%d ", arr[i]);
printf("n");
}// Driver program to test above functions
int main()
{
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr)/sizeof(arr[0]);
bubbleSort(arr, n);
printf("Sorted array: \\n");
printArray(arr, n);
return 0;
}
// Optimized java implementation
// of Bubble sort
import java.io.*;
class GFG
{
// An optimized version of Bubble Sort
static void bubbleSort(int arr[], int n)
{
int i, j, temp;
boolean swapped;
for (i = 0;
i <
n - 1;
i++)
{
swapped = false;
for (j = 0;
j <
n - i - 1;
j++)
{
if (arr[j] >
arr[j + 1])
{
// swap arr[j] and arr[j+1]
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true;
}
}// IF no two elements were
// swapped by inner loop, then break
if (swapped == false)
break;
}
}// Function to print an array
static void printArray(int arr[], int size)
{
int i;
for (i = 0;
i <
size;
i++)
System.out.print(arr[i] + " ");
System.out.println();
}// Driver program
public static void main(String args[])
{
int arr[] = { 64, 34, 25, 12, 22, 11, 90 };
int n = arr.length;
bubbleSort(arr, n);
System.out.println("Sorted array: ");
printArray(arr, n);
}
}
# Python3 Optimized implementation
# of Bubble sort# An optimized version of Bubble Sort
def bubbleSort(arr):
n = len(arr)# Traverse through all array elements
for i in range(n):
swapped = False# Last i elements are already
#in place
for j in range(0, n-i-1):# traverse the array from 0 to
# n-i-1. Swap if the element
# found is greater than the
# next element
if arr[j] >
arr[j+1] :
arr[j], arr[j+1] = arr[j+1], arr[j]
swapped = True# IF no two elements were swapped
# by inner loop, then break
if swapped == False:
break# Driver code to test above
arr = [64, 34, 25, 12, 22, 11, 90]bubbleSort(arr)print ("Sorted array :")
for i in range(len(arr)):
print ("%d" %arr[i],end=" ")
```c#
// Optimized C# implementation
// of Bubble sort
using System;
class GFG
{
// An optimized version of Bubble Sort
static void bubbleSort(int []arr, int n)
{
int i, j, temp;
bool swapped;
for (i = 0; i < n - 1; i++)
{
swapped = false;
for (j = 0; j < n - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
// swap arr[j] and arr[j+1]
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true;
}
}
// IF no two elements were
// swapped by inner loop, then break
if (swapped == false)
break;
}
}// Function to print an array
static void printArray(int []arr, int size)
{
int i;
for (i = 0;
i <
size;
i++)
Console.Write(arr[i] + " ");
Console.WriteLine();
}// Driver method
public static void Main()
{
int []arr = {64, 34, 25, 12, 22, 11, 90};
int n = arr.Length;
bubbleSort(arr,n);
Console.WriteLine("Sorted array");
printArray(arr,n);
}
}
```php
<
?php
// PHP Optimized implementation
// of Bubble sort// An optimized version of Bubble Sort
function bubbleSort(&
$arr)
{
$n = sizeof($arr);
// Traverse through all array elements
for($i = 0;
$i <
$n;
$i++)
{
$swapped = False;
// Last i elements are already
// in place
for ($j = 0;
$j <
$n - $i - 1;
$j++)
{// traverse the array from 0 to
// n-i-1. Swap if the element
// found is greater than the
// next element
if ($arr[$j] >
$arr[$j+1])
{
$t = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $t;
$swapped = True;
}
}// IF no two elements were swapped
// by inner loop, then break
if ($swapped == False)
break;
}
}// Driver code to test above
$arr = array(64, 34, 25, 12, 22, 11, 90);
$len = sizeof($arr);
bubbleSort($arr);
echo "Sorted array : \\n";
for($i = 0;
$i <
$len;
$i++)
echo $arr[$i]." ";
?>
<
script>
// Optimized javascript implementation
// of Bubble sort
// An optimized version of Bubble Sort
function bubbleSort(arr, n)
{
var i, j, temp;
var swapped;
for (i = 0;
i <
n - 1;
i++)
{
swapped = false;
for (j = 0;
j <
n - i - 1;
j++)
{
if (arr[j] >
arr[j + 1])
{
// swap arr[j] and arr[j+1]
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true;
}
}// IF no two elements were
// swapped by inner loop, then break
if (swapped == false)
break;
}
}// Function to print an array
function printArray(arr, size)
{
var i;
for (i = 0;
i <
size;
i++)
document.write(arr[i] + " ");
document.writeln();
}// Driver program
var arr = [ 64, 34, 25, 12, 22, 11, 90 ];
var n = arr.length;
bubbleSort(arr, n);
document.write("Sorted array: ");
printArray(arr, n);
// This code is contributed shivanisinghss2110
<
/script>
输出:
【冒泡排序】最坏和平均情况时间复杂度: O(n*n)。最坏的情况发生在数组反向排序时。
最佳情况时间复杂度: O(n)。最好的情况发生在数组已经排序时。
辅助空间: O(1)
边界情况:当元素已经排序时,冒泡排序花费最少的时间(n 的顺序)。
就地排序:是
稳定:是
由于其简单性,冒泡排序经常被用来引入排序算法的概念。
在计算机图形学中,它很受欢迎,因为它能够检测几乎排序的数组中的非常小的错误(例如仅交换两个元素),并仅使用线性复杂度 (2n) 修复它。例如,它用于多边形填充算法,其中边界线按其在特定扫描线(平行于 x 轴的线)处的 x 坐标进行排序,并且随着 y 的增加,它们的顺序仅在交点处发生变化(两个元素交换)两行
推荐阅读
- 如何正确提出数据需求
- 模拟实现库函数strlen,strcpy,strstr,memmove,memcpy,strcat
- RocketMQ(消息存储机制详解与源码解析)
- 程序自动化与进程的含义
- 解密并发幕后黑手(线程切换引发的原子性问题)
- [年薪60W分水岭]基于Netty手写实现Apache Dubbo(带注册中心和注解)
- 面霸篇(Java 集合容器大满贯(卷二))
- 这个无敌设计,可以解析并运算任意数学表达式
- Mellanox网卡驱动安装指南 Mellanox OFED