文章目录
1.冒泡排序的具体讲解
1.引入
冒泡排序是C语言语言入门的算法之一,是很多刚接触C语言的朋友们必学或者必接触的一个算法
2.引入某百科:冒泡排序算法的运作
1.比较相邻的元素。如果第一个比第二个大,就交换它们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
5.由于它的简洁,冒泡排序通常被用来对于程序设计入门的学生介绍算法的概念。
3.引入某百科:对于冒泡排序的叙述
冒泡排序(英语:Bubble Sort)又称为泡式排序,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。(看三遍再看下面的内容)
4.引入某百科:冒泡排序的进阶讲解
冒泡排序对N个项目需要O(n^2).的比较次数,且可以原地排序。尽管这个算法是最简单了解和实现的排序算法之一,但它对于包含大量的元素的数列排序是很没有效率的。
冒泡排序是与插入排序拥有相等的渐近时间复杂度,但是两种算法在需要的交换次数却很大地不同。在最坏的情况,冒泡排序需要O(n^2)次交换
而插入排序只要最多O(n)次交换。冒泡排序的实现通常会对已经排序好的数列拙劣地执行(O(n^2)),而插入排序在这个例子只需要 O(n)个运算。因此很多现代的算法教科书避免使用冒泡排序,而用插入排序取代之。冒泡排序如果能在内部循环第一次执行时,使用一个旗标来表示有无需要交换的可能,也可以把最优情况下的复杂度降低到O(n)。在这个情况,已经排序好的数列就无交换的需要。若在每次走访数列时,把走访顺序反过来,也可以稍微地改进效率。有时候称为鸡尾酒排序,因为算法会从数列的一端到另一端之间穿梭往返
2.冒泡排序的具体实现
1.创建一个数组,放上10个元素,求出数组元素的个数
int main()
{
int arr[] = { 9,4,5,3,6,2,8,7,1,10 };
int sz = sizeof(arr) / sizeof(arr[0]);//求被排序数组的个数
return 0;
}
2.把需要排序的数组和元素个数传递给bubble sort函数
void bubble_sort(int arr[] , int sz)
{
}
int main()
{
int arr[] = { 9,4,5,3,6,2,8,7,1,10 };
int sz = sizeof(arr) / sizeof(arr[0]);//元素个数
bubble_sort(arr,sz);
return 0;
}
3.开始外层的循环,外循环为排序躺数,sz个数进行sz-1趟
void bubble_sort(int arr[],int sz)
{
int i = 0;
for (i = 0; i <= sz - 1; i++)/*排序的躺数*/
{
}
}
4.开始内层的循环,内循环为每趟比较的次数,第i趟比较sz-i次
/*内层排序:每一趟排序的次数*/
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
/*判断是否交换两个相邻的元素*/
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
5.如果是有序数组
void bubble_sort(int arr[],int sz)
{
int i = 0;
for (i = 0; i <= sz - 1; i++)/*排序的躺数*/
{
int flag = 1;/*假设已经有序*/
/*每一趟排序的次数*/
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
flag = 0;/*不是有序数组的flag就为0*/
/*交换*/
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
/*内循环一趟过后,flag不为0,就说明没有交换,就是有序的,直接break*/
if (flag == 1)
{
break;
}
}
}
3.全部代码
#include<stdio.h>
void bubble_sort(int arr[],int sz)
{
int i = 0;
for (i = 0; i <= sz - 1; i++)/*排序的躺数*/
{
int flag = 1;/*假设已经有序*/
/*每一趟排序的次数*/
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
flag = 0;/*不是有序数组的flag就为0*/
/*交换*/
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
/*内循环一趟过后,flag不为0,就说明没有交换,就是有序的,直接break*/
if (flag == 1)
{
break;
}
}
}
int main()
{
int arr[] = { 9,4,5,3,6,2,8,7,1,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr,sz);
for (int i = 0; i < sz; i++)
{
printf("%d ", i);
}
return 0;
}
4.更规范的冒泡排序
#include <stdio.h>
#include <stdbool.h>
#define ARR_LEN 255 /* 数组长度上限*/
#define elemType int /* 元素类型 */
/* 冒泡排序 */
/* 1.从当前元素起,向后依次比较每一对相邻的元素,逆序则交换
2.对所有元素重复以上的步骤,直至最后一个元素
/* elemType arr[]: 排序目标数组; int len: 元素个数 */
void bubbleSort(int arr[], int len)
{
int i, j, temp;
_Bool exchanged = true;
for (i = 0; exchanged && i < len - 1; i++) { /* 外循环为排序躺数,len个数进行len-1趟,只有交换过,exchanged的值为true才有必要执行循环,否则exchanged的值为false不执行循环 */
exchanged = false;
for (j = 0; j < len - 1 - i; j++)
{ /* 内循环为每趟比较的次数,第i趟比较len-i次*/
if (arr[j] > arr[j + 1])
{ /* 相邻元素比较,如果逆序就交换(升序为左大右小,逆序反之) */
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
exchanged = true; /*只有数值互换过, exchanged才会从false变成true,否则数列以及排序完成,exchanged的值任然为false,没必要排序 */
}
}
}
}
int main() {
int arr[ARR_LEN] = { 3,5,1,-7,4,9,-6,8,10,4 };
int len = 10;
int i;
bubbleSort(arr, len);
for (i = 0; i < len; i++)
printf("%d\t", arr[i]);
putchar('\n');
return 0;
}
5.C++冒泡排序的实现
C++类模板的冒泡排序
#include<iostream>
using namespace std;
template<typename T>
void bubblesort(T arr[], int n)
{
bool done = 0;
for (int i = 1; i < n && !done; i++)
{
done = 1;
for (int j = 1; j <= n - 1; j++)
if (arr[j - 1] > arr[j])
{
T temp = arr[j - 1];
arr[j - 1] = arr[j];
arr[j] = temp;
done = 0;
}
}
}
int main()
{
int const len = 20;
int i = 0, n = 0, a[len];
cout << "被排序元素的个数 = ";
cin >> n;
cout << "输入" << n << "个元素";
for (i = 0; i < n; i++)
{
cin >> a[i];
}
bubblesort(a, n);
for (i = 0; i < n; i++)
{
cout << a[i] << " ";
cout << " ";
}
return 0;
}