冒泡排序

努力尽今夕,少年犹可夸。这篇文章主要讲述冒泡排序相关的知识,希望能为你提供帮助。
冒泡排序是最简单的排序算法,它通过重复交换相邻元素(如果它们的顺序错误)来工作。
示例:
第一遍:
( 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 的增加,它们的顺序仅在交点处发生变化(两个元素交换)两行

    推荐阅读