zoukankan      html  css  js  c++  java
  • 数据结构(2)冒泡排序和简单选择排序

    一、冒泡排序

    • 先抛出主程序
    package Sort;
    
    public class BubbleSort {
    
    	public static void main(String[] args) {
    		
    		int [] a = {2,5,6,7,1,8,9};
    		BubbleSort3( a, 6);
    		for(int k = 0; k <= 6; k++){
    			System.out.println(a[k]);
    		}
    	}
    	
    	static void BubbleSort3(int [] a, int n){
    		int i = 0;
    		int j = 0;
    		boolean flag = true;
    		for (i=0; i<=n && flag==true; i++){
    			flag = false;
    			for (j=n; j>=(i+1); j--){
    				if (a[j] < a[j-1]){
    					swap(a, j, i);
    					flag = true;
    				}
    			}
    		}
    	}	
    	
    	static void BubbleSort2(int [] a, int n){
    		int i = 0;
    		int j = 0;
    		for (i=0; i<=n; i++){
    			for (j=n; j>=(i+1); j--){
    				if (a[j] < a[j-1]){
    					swap(a, j, i);
    				}
    			}
    		}
    	}
    	
    	static void BubbleSort1(int [] a, int n){
    		int i = 0;
    		int j = 0;
    		for (i=0; i<=n; i++){
    			for (j=i+1;j<=n; j++){
    				if (a[j] < a[i]){
    					swap(a, j, i);
    				}
    			}
    		}
    	}
    	
    	static void swap(int [] num,int j, int i){
    		int temp;
    		temp = num[i];
    		num[i] = num[j];
    		num[j] = temp;
    	}
    }
    
    • 冒泡排序初级版本  
    	static void BubbleSort1(int [] a, int n){
    		int i = 0;
    		int j = 0;
    		for (i=0; i<=n; i++){
    			for (j=i+1;j<=n; j++){
    				if (a[j] < a[i]){
    					swap(a, j, i);
    				}
    			}
    		}
    	}
    

      严格意义上讲,这只是对顺序表作交换排序,时间复杂度分析为O(N2)。而且由于swap操作只要在满足后值小于当前值的情况下就进行,而不是与后续值最小的值进行交换,所以就增多了很多不必要的操作。

    •  冒泡排序正式版
    	static void BubbleSort2(int [] a, int n){
    		int i = 0;
    		int j = 0;
    		for (i=0; i<=n; i++){
    			for (j=n; j>=(i+1); j--){
    				if (a[j] < a[j-1]){
    					swap(a, j, i);
    				}
    			}
    		}
    	}
    

      这个版本与上一个的区别是,内循环从j=n开始,那么效果就是,相邻比较,小的上升,这就是冒泡排序的命名由来。这个算法会在每一次外循环中,就会把小的值往顺序表前移。但是在当我们的表已经是有顺序的,只是某几位不同的情况呢?我们有一种优化措施。

    • 冒泡排序正式优化版 
    	static void BubbleSort3(int [] a, int n){
    		int i = 0;
    		int j = 0;
    		boolean flag = true;
    		for (i=0; i<=n && flag==true; i++){
    			flag = false;
    			for (j=n; j>=(i+1); j--){
    				if (a[j] < a[j-1]){
    					swap(a, j, i);
    					flag = true;
    				}
    			}
    		}
    	}
    

      可以看到我们加入了一个标志位flag,但上次循环没有改变顺序时,说明此时表已经有序,则停止继续循环。冒泡排序的时间复杂度是O(N2)。 

    二、简单选择排序

    • 先抛出主程序
    package Sort;
    
    public class SimpleSelectSort {
    
    	public static void main(String[] args) {
    		int [] a = {8,4,5,2,1,7};
    		SimpleSelectSort1(a, 5);
    		for(int k = 0; k <= 5; k++){
    			System.out.println(a[k]);
    		}
    	}
    
    	static void SimpleSelectSort1(int [] a, int length){
    		int i,j,min;
    		for ( i=0; i<=length; i++) {
    			min = i;
    			for ( j=i+1; j<=length; j++) {
    				if (a[j] < a[min]) {
    					min = j;
    				}
    			}
    			if(i != min)
    				swap(a, i, min);
    		}
    	}
    	
    	static void swap(int [] num,int j, int i){
    		int temp;
    		temp = num[i];
    		num[i] = num[j];
    		num[j] = temp;
    	}
    }
    
    • 简单选择排序分析

      简单排序的原理是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,和第i个记录交换之。

    	static void SimpleSelectSort1(int [] a, int length){
    		int i,j,min;
    		for ( i=0; i<=length; i++) {
    			min = i;
    			for ( j=i+1; j<=length; j++) {
    				if (a[j] < a[min]) {
    					min = j;
    				}
    			}
    			if(i != min)
    				swap(a, i, min);
    		}
    	}
    

      简单排序的时间复杂度也是O(N2)。这也是业内为何推崇归并排序和快速排序的原因,因为他们的时间复杂度是O(N)。我会在以后的随笔中介绍。

  • 相关阅读:
    赋值问题
    构造方法的作用
    this的使用
    三目运算符和形参的使用
    构造方法作用:给所有对象进行相同的初始化操作
    成员变量和局部变量
    相关开发的书籍名汇集
    html ---- web sql 例子
    让input表单输入框不记录输入过信息的方法
    css实现两端对齐的3种方法
  • 原文地址:https://www.cnblogs.com/danbing/p/5144216.html
Copyright © 2011-2022 走看看