算法之冒泡排序

本文详细介绍了冒泡排序算法的工作原理,包括其图解和遍历次数。通过示例代码展示了Java实现的冒泡排序,同时探讨了冒泡排序的时间复杂度,并提出了改进方案。在改进版中,如果在某次遍历中没有发生交换,就不再进行后续遍历,提高了效率。此外,还讨论了泛型冒泡排序,利用Comparable接口和自定义Comparator进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

冒泡排序算法需要遍历几次数组。每次遍历都要比较连续相邻的元素,如果某一对相邻元素是降序,则互换它们的值,否则,保持不变。由于较小的值像“气泡”一样逐渐浮想顶部,而较大的值沉向底部,所以叫冒泡排序。

冒泡排序的图解是:


总结一句话就是:连续比较相邻的元素,降序则呼唤。有n个数,共需要比较n-1趟,第i趟,需要比较n-i次。

BubbleSort.Java

[java]  view plain  copy
 
print ? 在CODE上查看代码片 派生到我的代码片
  1. public class BubbleSort {//时间复杂度O(n^2)  
  2.       
  3.     public static void display(int[] array){  
  4.         for(int i=0;i<array.length;i++){    
  5.              System.out.print(array[i]+"\t");    
  6.          }    
  7.          System.out.println();   
  8.     }  
  9.     //冒泡排序  
  10.     public static void bubbleSort(int[] list){  
  11.         int n=list.length;  
  12.         for(int i=1;i<n;i++){//总共比较n-1趟  
  13.             for(int j=0;j<n-i;j++){//第i趟比较n-i次  
  14.                 if(list[j]>list[j+1]){  
  15.                     int temp;  
  16.                     temp=list[j];  
  17.                     list[j]=list[j+1];  
  18.                     list[j+1]=temp;               
  19.                 }  
  20.             }  
  21.               
  22.             System.out.print("第"+(i)+"轮排序结果:");    
  23.             display(list);  
  24.         }  
  25.           
  26.     }  
  27.     public static void main(String args[]){  
  28.         int[] list={25,6,56,24,9,12,55};     
  29.         System.out.println("冒泡排序前的list是:");  
  30.         for(int i=0;i<list.length;i++){  
  31.             System.out.print(list[i]+" ");  
  32.         }  
  33.         System.out.println();  
  34.         bubbleSort(list);//进行冒泡排序  
  35.         System.out.println();  
  36.         System.out.println("冒泡排序后的list是:");  
  37.         for(int i=0;i<list.length;i++){  
  38.             System.out.print(list[i]+" ");  
  39.         }  
  40.     }  
  41. }  
[java]  view plain  copy
 print ?
  1. public class BubbleSort {//时间复杂度O(n^2)  
  2.       
  3.     public static void display(int[] array){  
  4.         for(int i=0;i<array.length;i++){    
  5.              System.out.print(array[i]+"\t");    
  6.          }    
  7.          System.out.println();   
  8.     }  
  9.     //冒泡排序  
  10.     public static void bubbleSort(int[] list){  
  11.         int n=list.length;  
  12.         for(int i=1;i<n;i++){//总共比较n-1趟  
  13.             for(int j=0;j<n-i;j++){//第i趟比较n-i次  
  14.                 if(list[j]>list[j+1]){  
  15.                     int temp;  
  16.                     temp=list[j];  
  17.                     list[j]=list[j+1];  
  18.                     list[j+1]=temp;               
  19.                 }  
  20.             }  
  21.               
  22.             System.out.print("第"+(i)+"轮排序结果:");    
  23.             display(list);  
  24.         }  
  25.           
  26.     }  
  27.     public static void main(String args[]){  
  28.         int[] list={25,6,56,24,9,12,55};     
  29.         System.out.println("冒泡排序前的list是:");  
  30.         for(int i=0;i<list.length;i++){  
  31.             System.out.print(list[i]+" ");  
  32.         }  
  33.         System.out.println();  
  34.         bubbleSort(list);//进行冒泡排序  
  35.         System.out.println();  
  36.         System.out.println("冒泡排序后的list是:");  
  37.         for(int i=0;i<list.length;i++){  
  38.             System.out.print(list[i]+" ");  
  39.         }  
  40.     }  
  41. }  

算法分析:

最差的情况下,冒泡排序算法需要进行n-1次遍历。第一次遍历需要n-1次比较,第二次遍历需要n-2次比较,依次进行;因此比较总数为:

(n-1)+(n-2)+...+2+1=n(n-1)/2=O(n2)

冒泡排序的时间复杂度为O(n2)


冒泡算法的改进:

冒泡排序的效率比较低,所以我们要通过各种方法改进。在上例中,第四轮排序之后实际上整个数组已经是有序的了,最后两轮的比较没必要进行。

注意:如果某次遍历中没有发生交换,那么就不必进行下一次遍历,因为所有元素已经排好了。

BubbleImprovedSort.Java

[java]  view plain  copy
 
print ? 在CODE上查看代码片 派生到我的代码片
  1. public class BubbleImprovedSort {  
  2.     public static void display(int[] array){  
  3.         for(int i=0;i<array.length;i++){    
  4.              System.out.print(array[i]+"\t");    
  5.          }    
  6.          System.out.println();   
  7.     }  
  8.     //冒泡排序  
  9.     public static void bubbleSort(int[] list){  
  10.             int n=list.length;  
  11.             boolean NeedNextPass=true;  
  12.             for(int i=1;i<n&&NeedNextPass;i++){//总共比较n-1趟,如果某趟遍历中没有交换,那么不需要下次遍历,因为元素以排好  
  13.                 NeedNextPass=false;  
  14.                 for(int j=0;j<n-i;j++){//第i趟比较n-i次  
  15.                     if(list[j]>list[j+1]){  
  16.                         int temp;  
  17.                         temp=list[j];  
  18.                         list[j]=list[j+1];  
  19.                         list[j+1]=temp;       
  20.                         NeedNextPass=true;  
  21.                     }  
  22.                 }  
  23.                 System.out.print("第"+(i)+"轮排序结果:");    
  24.                 display(list);  
  25.             }  
  26.         }  
  27.         public static void main(String args[]){  
  28.             int[] list={25,6,56,24,9,12,55};   
  29.             System.out.println("改进的冒泡排序:");  
  30.             System.out.println("排序前的list是:");  
  31.             for(int i=0;i<list.length;i++){  
  32.                 System.out.print(list[i]+" ");  
  33.             }  
  34.             System.out.println();  
  35.             bubbleSort(list);//进行冒泡排序  
  36.             System.out.println();  
  37.             System.out.println("排序后的list是:");  
  38.             for(int i=0;i<list.length;i++){  
  39.                 System.out.print(list[i]+" ");  
  40.             }  
  41.         }  
  42.   
  43. }  
[java]  view plain  copy
 print ?
  1. public class BubbleImprovedSort {  
  2.     public static void display(int[] array){  
  3.         for(int i=0;i<array.length;i++){    
  4.              System.out.print(array[i]+"\t");    
  5.          }    
  6.          System.out.println();   
  7.     }  
  8.     //冒泡排序  
  9.     public static void bubbleSort(int[] list){  
  10.             int n=list.length;  
  11.             boolean NeedNextPass=true;  
  12.             for(int i=1;i<n&&NeedNextPass;i++){//总共比较n-1趟,如果某趟遍历中没有交换,那么不需要下次遍历,因为元素以排好  
  13.                 NeedNextPass=false;  
  14.                 for(int j=0;j<n-i;j++){//第i趟比较n-i次  
  15.                     if(list[j]>list[j+1]){  
  16.                         int temp;  
  17.                         temp=list[j];  
  18.                         list[j]=list[j+1];  
  19.                         list[j+1]=temp;       
  20.                         NeedNextPass=true;  
  21.                     }  
  22.                 }  
  23.                 System.out.print("第"+(i)+"轮排序结果:");    
  24.                 display(list);  
  25.             }  
  26.         }  
  27.         public static void main(String args[]){  
  28.             int[] list={25,6,56,24,9,12,55};   
  29.             System.out.println("改进的冒泡排序:");  
  30.             System.out.println("排序前的list是:");  
  31.             for(int i=0;i<list.length;i++){  
  32.                 System.out.print(list[i]+" ");  
  33.             }  
  34.             System.out.println();  
  35.             bubbleSort(list);//进行冒泡排序  
  36.             System.out.println();  
  37.             System.out.println("排序后的list是:");  
  38.             for(int i=0;i<list.length;i++){  
  39.                 System.out.print(list[i]+" ");  
  40.             }  
  41.         }  
  42.   
  43. }  


泛型冒泡排序:

例1:元素实现comparable接口。排序是字符串string,string实现了comparable接口

BubbleGenericTypeSort .java

[java]  view plain  copy
 
print ? 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:24px;">public class BubbleGenericTypeSort {  
  2.     //泛型冒泡排序,使用Comparable对元素进行排序  
  3.         public static <E extends Comparable<E>> void bubbleGenericTypeSort(E[] list){  
  4.             int n=list.length;  
  5.             for(int i=1;i<n;i++){//总共比较n-1趟  
  6.                 for(int j=0;j<n-i;j++){//第i趟比较n-i次  
  7.                     if(list[j].compareTo(list[j+1])>0){  
  8.                         E temp;  
  9.                         temp=list[j];  
  10.                         list[j]=list[j+1];  
  11.                         list[j+1]=temp;               
  12.                     }  
  13.                 }  
  14.             }  
  15.         }  
  16.           
  17.     public static void main(String[] args) {  
  18.         // TODO Auto-generated method stub  
  19.         /*Integer[] list={2,1,56,34,9,6,55,20,37,22}; //泛型的Integer ,包装类都实现了Comparable接口 
  20.         System.out.println("冒泡排序前的list是:"); 
  21.         for(int i=0;i<list.length;i++){ 
  22.             System.out.print(list[i]+" "); 
  23.         } 
  24.         bubbleGenericTypeSort(list);//进行冒泡排序 
  25.         System.out.println(); 
  26.         System.out.println("冒泡排序后的list是:"); 
  27.         for(int i=0;i<list.length;i++){ 
  28.             System.out.print(list[i]+" "); 
  29.         }*/  
  30.         String[] list={"John","Mike","Jack","Bob","Zoo","Meache","Abrow","Richer"}; //泛型的String ,包装类都实现了Comparable接口  
  31.         System.out.println("冒泡排序前的list是:");  
  32.         for(int i=0;i<list.length;i++){  
  33.             System.out.print(list[i]+" ");  
  34.         }  
  35.         bubbleGenericTypeSort(list);//进行冒泡排序  
  36.         System.out.println();  
  37.         System.out.println("冒泡排序后的list是:");  
  38.         for(int i=0;i<list.length;i++){  
  39.             System.out.print(list[i]+" ");  
  40.         }  
  41.     }  
  42. }  
  43.   
  44. </span>  
[java]  view plain  copy
 print ?
  1. <span style="font-size:24px;">public class BubbleGenericTypeSort {  
  2.     //泛型冒泡排序,使用Comparable对元素进行排序  
  3.         public static <E extends Comparable<E>> void bubbleGenericTypeSort(E[] list){  
  4.             int n=list.length;  
  5.             for(int i=1;i<n;i++){//总共比较n-1趟  
  6.                 for(int j=0;j<n-i;j++){//第i趟比较n-i次  
  7.                     if(list[j].compareTo(list[j+1])>0){  
  8.                         E temp;  
  9.                         temp=list[j];  
  10.                         list[j]=list[j+1];  
  11.                         list[j+1]=temp;               
  12.                     }  
  13.                 }  
  14.             }  
  15.         }  
  16.           
  17.     public static void main(String[] args) {  
  18.         // TODO Auto-generated method stub  
  19.         /*Integer[] list={2,1,56,34,9,6,55,20,37,22}; //泛型的Integer ,包装类都实现了Comparable接口 
  20.         System.out.println("冒泡排序前的list是:"); 
  21.         for(int i=0;i<list.length;i++){ 
  22.             System.out.print(list[i]+" "); 
  23.         } 
  24.         bubbleGenericTypeSort(list);//进行冒泡排序 
  25.         System.out.println(); 
  26.         System.out.println("冒泡排序后的list是:"); 
  27.         for(int i=0;i<list.length;i++){ 
  28.             System.out.print(list[i]+" "); 
  29.         }*/  
  30.         String[] list={"John","Mike","Jack","Bob","Zoo","Meache","Abrow","Richer"}; //泛型的String ,包装类都实现了Comparable接口  
  31.         System.out.println("冒泡排序前的list是:");  
  32.         for(int i=0;i<list.length;i++){  
  33.             System.out.print(list[i]+" ");  
  34.         }  
  35.         bubbleGenericTypeSort(list);//进行冒泡排序  
  36.         System.out.println();  
  37.         System.out.println("冒泡排序后的list是:");  
  38.         for(int i=0;i<list.length;i++){  
  39.             System.out.print(list[i]+" ");  
  40.         }  
  41.     }  
  42. }  
  43.   
  44. </span>  


例2.元素实现自定义的Comparator比较器接口


BubbleComparator.java

[java]  view plain  copy
 
print ? 在CODE上查看代码片 派生到我的代码片
  1. import java.util.ArrayList;  
  2. import java.util.Comparator;  
  3. import java.util.List;  
  4.   
  5. public class BubbleComparator {  
  6.      public static <E>  void bubbleComparatorSort(List<E> list,Comparator<? super E> comparator){//<? super E>是E的父类  
  7.          int n=list.size();  
  8.         for(int i=1;i<n;i++){//总共比较n-1趟  
  9.             for(int j=0;j<n-i;j++){//第i趟比较n-i次  
  10.                 if(comparator.compare(list.get(j), list.get(j+1))==1){  
  11.                     E temp;  
  12.                     temp=list.get(j);  
  13.                     list.set(j, list.get(j+1));  
  14.                     list.set(j+1, temp);                          
  15.                 }  
  16.             }  
  17.         }  
  18.      }  
  19.           
  20.     public static void main(String[] args) {  
  21.         // TODO Auto-generated method stub        
  22.         List<GeometricObject> list=new ArrayList<GeometricObject>();  
  23.         list.add(new Rectangle(4,5,"矩形4,5"));  
  24.         list.add(new Circle(3,"圆3"));  
  25.         list.add(new Square(3,"正方形3"));  
  26.         list.add(new Rectangle(2,6,"矩形2,6"));  
  27.         list.add(new Circle(4,"圆4"));  
  28.           
  29.         System.out.println("冒泡排序前的list是:");  
  30.         for(int i=0;i<list.size();i++){  
  31.             System.out.print(list.get(i).getName()+":"+list.get(i).getArea()+"  ");  
  32.         }  
  33.         bubbleComparatorSort(list, new GeometricObjectComparator());//进行冒泡排序  
  34.         System.out.println();  
  35.         System.out.println("冒泡排序后的list是:");  
  36.         for(int i=0;i<list.size();i++){  
  37.             System.out.print(list.get(i).getName()+":"+list.get(i).getArea()+"  ");  
  38.         }  
  39.           
  40.     }  
  41.     
  42.     public static class GeometricObjectComparator implements Comparator<GeometricObject> {  
  43.         GeometricObjectComparator(){}  
  44.        
  45.         @Override  
  46.         public int compare(GeometricObject o1, GeometricObject o2) {  
  47.             // TODO Auto-generated method stub  
  48.             float area1=o1.getArea();  
  49.             float area2=o2.getArea();  
  50.             if(area1<area2){  
  51.                 return -1;  
  52.             }  
  53.             else if(area1==area2)  
  54.                 return 0;  
  55.             else   
  56.                 return 1;  
  57.         }  
  58.           
  59.     }  
  60. }  
[java]  view plain  copy
 print ?
  1. import java.util.ArrayList;  
  2. import java.util.Comparator;  
  3. import java.util.List;  
  4.   
  5. public class BubbleComparator {  
  6.      public static <E>  void bubbleComparatorSort(List<E> list,Comparator<? super E> comparator){//<? super E>是E的父类  
  7.          int n=list.size();  
  8.         for(int i=1;i<n;i++){//总共比较n-1趟  
  9.             for(int j=0;j<n-i;j++){//第i趟比较n-i次  
  10.                 if(comparator.compare(list.get(j), list.get(j+1))==1){  
  11.                     E temp;  
  12.                     temp=list.get(j);  
  13.                     list.set(j, list.get(j+1));  
  14.                     list.set(j+1, temp);                          
  15.                 }  
  16.             }  
  17.         }  
  18.      }  
  19.           
  20.     public static void main(String[] args) {  
  21.         // TODO Auto-generated method stub        
  22.         List<GeometricObject> list=new ArrayList<GeometricObject>();  
  23.         list.add(new Rectangle(4,5,"矩形4,5"));  
  24.         list.add(new Circle(3,"圆3"));  
  25.         list.add(new Square(3,"正方形3"));  
  26.         list.add(new Rectangle(2,6,"矩形2,6"));  
  27.         list.add(new Circle(4,"圆4"));  
  28.           
  29.         System.out.println("冒泡排序前的list是:");  
  30.         for(int i=0;i<list.size();i++){  
  31.             System.out.print(list.get(i).getName()+":"+list.get(i).getArea()+"  ");  
  32.         }  
  33.         bubbleComparatorSort(list, new GeometricObjectComparator());//进行冒泡排序  
  34.         System.out.println();  
  35.         System.out.println("冒泡排序后的list是:");  
  36.         for(int i=0;i<list.size();i++){  
  37.             System.out.print(list.get(i).getName()+":"+list.get(i).getArea()+"  ");  
  38.         }  
  39.           
  40.     }  
  41.     
  42.     public static class GeometricObjectComparator implements Comparator<GeometricObject> {  
  43.         GeometricObjectComparator(){}  
  44.        
  45.         @Override  
  46.         public int compare(GeometricObject o1, GeometricObject o2) {  
  47.             // TODO Auto-generated method stub  
  48.             float area1=o1.getArea();  
  49.             float area2=o2.getArea();  
  50.             if(area1<area2){  
  51.                 return -1;  
  52.             }  
  53.             else if(area1==area2)  
  54.                 return 0;  
  55.             else   
  56.                 return 1;  
  57.         }  
  58.           
  59.     }  
  60. }  
在基于MFC (Microsoft Foundation Classes) 的应用程序开发中,设计一个支持输入错误重试的登录界面通常会包含以下几个步骤: 1. **窗口布局**: 创建一个简单的登录对话框,包括两个文本框(用于用户名和密码输入)、一个按钮(登录)以及一个可能的状态指示区域(如标签或消息框)。 2. **事件处理**: - **登录按钮点击事件**:当用户点击登录按钮时,首先验证输入是否有效。如果输入有误,比如用户名或密码为空,或者不符合预期格式,捕获这种异常。 3. **错误处理**: - 验证失败时,显示相应的错误提示信息,可能是设置文本框内的提示文本变红、弹出错误对话框或者更新状态标签。同时,可以添加一个“重试”功能,例如禁用当前按钮并允许用户清除输入然后再次尝试。 4. **重试机制**: - 如果设置了“重试”功能,可以在对话框上增加一个计数器或一个复选框,用户可以选择重试次数。每次点击“重试”时,将计数减一,直到达到预设的最大次数或用户自行退出。 5. **循环或递归**: 使用条件判断来控制重试过程。如果还有剩余的重试次数并且输入正确,则重置错误提示,清空文本框内容并允许登录操作;否则,停止重试并告知用户已达到最大次数或其他相应限制。 ```cpp // 示例代码片段 void CLoginDlg::OnBnClickedButtonLogin() { if (!ValidateInputs()) // 检查输入有效性 { // 显示错误提示 SetDlgItemText(IDC_ERROR_MSG, "用户名或密码错误"); // 判断重试次数 int retryCount = GetRetryCount(); // 获取当前的重试次数 if (retryCount > 0) { --retryCount; // 禁用登录按钮并允许用户修改输入 EnableWindow(pDX->GetDlgItem(IDC_BUTTON_LOGIN), false); UpdateData(FALSE); // 更新控件数据以便用户编辑 } else { MessageBox("已达最大重试次数,请联系管理员", "登录失败", MB_OK | MB_ICONERROR); EndDialog(IDCANCEL); // 结束对话框 } } else { // 登录成功或无误,执行后续逻辑 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值