冒泡排序:
冒泡排序的原理很简单,归结起来就是:比较和交换
JAVA实验代码如下:
public class test {
public static void main(String[] args) {
int [] arr={9,8,3,5,2};
System.out.println("冒泡排序前:");
printArray(arr); //打印数组元素
bubbleSort(arr); //调用排序方法
System.out.println("冒泡排序后:");
printArray(arr); //打印数组元素
}
//定义打印数组方法
public static void printArray(int [] arr){
//循环遍历数组的元素
for(int i = 0 ; i<arr.length; i++)
{
System.out.print(arr[i]+" "); //打印元素和空格
}
System.out.println("\n"); //换行
}
//定义对数组排序的方法
public static void bubbleSort(int [] arr){
//定义外层循环
for(int i = 0 ; i<arr.length-1;i++)
{
//定义内层循环
for(int j = 0; j<arr.length-1;j++)
{
if(arr[j]>arr[j+1])
{
//比较相邻元素,满足条件~交换
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
System.out.println("第"+(i+1)+"轮排序后:");
printArray(arr); //每轮比较结束打印数组元素
}
}
}
运行结果如图:
C++代码实现代码如下:
#include <iostream>
using namespace std;
int bug(int a[],int n)
{
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
} //输出数组的函数
void bubbleSort(int a[],int n)
{
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-1;j++)
{
if(a[j]>a[j+1])
{
int temp = a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
bug(a,n);
}
int main()
{
int a[5]={9,8,3,5,2};
cout<<"冒泡排序前的数组元素为:";
bug(a,5);
cout<<"冒泡排序后的数组元素为:";
bubbleSort(a,5);
}
运行结果如图:
这里我们要考虑一个问题,如果初始给出的数组序列已经很接近从小到大或者从大到小的排列,那么我们还是否有必要继续遍历比较每个数字???
例如:初始给出的数组的序列为:1 2 3 4 5 6 7 8 10 9
我们会惊讶的发现:
他就那么12345678910的跑了九轮!!!
那么我们如何解决这种情况呢?
我们可以在循环里加一个标志,用来检测此次循环是否有数据交换,如果没有则说明冒泡排序已经结束
这里我仅以JAVA中添加该标志作为演示:
public class hello {
public static void main(String[] args) {
int [] arr={1,2,3,4,5,6,7,8,10,9};
System.out.println("冒泡排序前:");
printArray(arr); //打印数组元素
bubbleSort(arr); //调用排序方法
System.out.println("冒泡排序后:");
printArray(arr); //打印数组元素
}
//定义打印数组方法
public static void printArray(int [] arr){
//循环遍历数组的元素
for(int i = 0 ; i<arr.length; i++)
{
System.out.print(arr[i]+" "); //打印元素和空格
}
System.out.println("\n");
}
//定义对数组排序的方法
public static void bubbleSort(int [] arr){
//定义外层循环
int flag=0;
for(int i = 0 ; i<arr.length-1;i++)
{
//定义内层循环
for(int j = 0; j<arr.length-1;j++)
{
if(arr[j]>arr[j+1])
{
//比较相邻元素
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
flag=1;
}
}
if(flag==0)
{
return;
}
System.out.print("第"+(i+1)+"轮排序后:");
printArray(arr); //每轮比较结束打印数组元素
}
}
}
此时的运行结果变成了:
在C++中也是一样,只需添加一个flag=0; 当一轮循环结束 flag依旧为0时,说明本轮没有元素发生交换,即冒泡完成,跳出循环结束程序即可。
另外还有一种办法就是找到并记录上次排序的位置,从而使下一次的排序少比较一些数据,这个方法我日后会再给大家更新出来!希望大家能跟我多多交流,我们互相学习,同时更希望各位大佬能多指点指点我,不胜感激!