• 数据结构(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)。我会在以后的随笔中介绍。

  • 相关阅读:
    LRU(Least Recently Used最近最少使用)的c++实现(顺序表)
    linux下的性能分析profiling(动态)
    实习的具体内容
    x86_64 Ubuntu 14.04 LST安装gcc4.1.2 转载
    Gem5全系统模式下运行SPLASH-2 Benchmarks使用alpha ISA
    gem5 运行x86全系统仿真
    Linux操作系统下三种配置环境变量的方法——转载
    找实习小结
    multi2sim,booksim简介
    破壳(2)之触摸
  • 原文地址:https://www.cnblogs.com/danbing/p/5144216.html
Copyright © 2020-2023  润新知