zoukankan      html  css  js  c++  java
  • 冒泡、选择、插入、快速排序

    package paixu;
    import java.util.Random;
    
    public class test {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    
    		
    		int[] a={34,45,6,3,1,3,534,456,3};
    		int[] b;
    	
    		b=maopao(a);
    		System.out.println("冒泡排序:");
    		for(int c:b){
    			System.out.print(c+",");
    		}
    		
    		b=xuanze(a);	
    		System.out.println();
    		System.out.println("选择排序:");
    		for(int c:b){
    			System.out.print(c+",");
    		}
    		
    		b=charu(a);	
    		System.out.println();
    		System.out.println("插入排序:");
    		for(int c:b){
    			System.out.print(c+",");
    		}
    		
    		b = quickSort(a,0,a.length-1);
    		System.out.println();
    		System.out.println("快速排序:");
    		for(int c:b){
    			System.out.print(c+",");
    		}
    		
    		b = quickSort2(a,0,a.length-1);
    		System.out.println();
    		System.out.println("快速排序2:");
    		for(int c:b){
    			System.out.print(c+",");
    		}
    		
    	}
    //	冒泡排序
        /**  
         * 依次比较相邻的两个数,将小数放在前面,大数放在后面  
         * 冒泡排序,具有稳定性  
         * 时间复杂度为O(n^2)  
         * 不及堆排序,快速排序O(nlogn,底数为2)  
         * @author liangge  
         *  
         */ 
    	public static int[] maopao(int[] a){
    		
    		for(int i=0;i<a.length-1;i++){
    			for(int j=a.length-1;j>i;j--){
    				if(a[j]<a[j-1]){
    					int temp=a[j];
    					a[j]=a[j-1];
    					a[j-1]=temp;
    				}
    			}
    		}
    		return a;
    		
    	}
    //	选择排序
        /**  
         * 选择排序  
         * 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,  
         * 顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。   
         * 选择排序是不稳定的排序方法。  
         * @author liangge  
         *   
         */
    	public static int[] xuanze(int[] a) {
    		 
    		for (int i = 0; i < a.length-1; i++) {
    			int minindex=i;
    			for (int j = i+1; j < a.length; j++) {
    				if(a[j]<a[minindex]){
    					minindex=j;
    				}
    			}
    			if(minindex!=i){
    				int temp=a[i];
    				a[i]=a[minindex];
    				a[minindex]=temp;
    			}
    		}
    		return a;
    	}
    //	插入排序
        /**  
         * 直接插入排序  
         * 将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据  
         * 算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。  
         */
    	public static int[] charu(int[] a) {
    		
    		for (int i = 0; i < a.length-1; i++) {
    			for (int j = i+1; j > 0; j--) {
    				if(a[j]<a[j-1]){
    					int temp=a[j];
    					a[j]=a[j-1];
    					a[j-1]=temp;
    				}
    			}
    		}
    		return a;
    	}
    //	快速排序
        /**  
         * 快速排序 通过一趟排序将要排序的数据分割成独立的两部分,
         * 其中一部分的所有数据都比另外一部分的所有数据都要小,  
         * 然后再按此方法对这两部分数据分别进行快速排序, 
         * 整个排序过程可以递归进行,以此达到整个数据变成有序序列。  
         * @author liangge  
         *   
         */
    	public static int[] quickSort(int a[],int l,int r){
    	     if(l>=r)
    	       return null;
    
    	     int i = l; int j = r; int key = a[l];//选择第一个数为key
    
    	     while(i<j){
    
    	         while(i<j && a[j]>=key)//从右向左找第一个小于key的值
    	             j--;
    	         if(i<j){
    	             a[i] = a[j];
    	             i++;
    	         }
    
    	         while(i<j && a[i]<key)//从左向右找第一个大于key的值
    	             i++;
    
    	         if(i<j){
    	             a[j] = a[i];
    	             j--;
    	         }
    	     }
    	     //i == j
    	     a[i] = key;
    	     quickSort(a, l, i-1);//递归调用
    	     quickSort(a, i+1, r);//递归调用
    	     
    	     return a;
    	 }
    	
    	/**  
         * 快速排序  
         * @param sort 要排序的数组  
         * @param start 排序的开始座标  
         * @param end 排序的结束座标  
         */  
        public static int[] quickSort2(int[] sort, int start, int end) {   
            // 设置关键数据key为要排序数组的第一个元素,   
            // 即第一趟排序后,key右边的数全部比key大,key左边的数全部比key小   
            int key = sort[start];   
            // 设置数组左边的索引,往右移动判断比key大的数   
            int i = start;   
            // 设置数组右边的索引,往左移动判断比key小的数   
            int j = end;   
            // 如果左边索引比右边索引小,则还有数据没有排序   
            while (i < j) {   
                while (sort[j] > key && j > start) {   
                    j--;   
                }   
                while (sort[i] < key && i < end) {   
                    i++;   
                }   
                if (i < j) {   
                    int temp = sort[i];   
                    sort[i] = sort[j];   
                    sort[j] = temp;   
                }   
            }   
            // 如果左边索引比右边索引要大,说明第一次排序完成,将sort[j]与key对换,   
            // 即保持了key左边的数比key小,key右边的数比key大   
            if (i > j) {   
                int temp = sort[j];   
                sort[j] = sort[start];   
                sort[start] = temp;   
            }   
            //递归调用   
            if (j > start && j < end) {   
                quickSort(sort, start, j - 1);   
                quickSort(sort, j + 1, end);   
            }   
            return sort;
        }   
    
    }
    
    
  • 相关阅读:
    全局上下文(GO)
    重写数组拓展方法
    spring + spring mvc 使用 maven 编译出现异常
    shiro 配置注解后无权访问不进行页面跳转异常:org.apache.shiro.authz.UnauthorizedException: Subject does not have permission
    shiro 配置注解异常 java.lang.ClassNotFoundException: org.aspectj.util.PartialOrder$PartialComparable
    kaptcha 配置
    maven 安装 jar 包
    jsp 页面 javax.servlet.jsp.JspException cannot be resolved to a type 异常
    操作系统下载地址
    java file 常用操作
  • 原文地址:https://www.cnblogs.com/dutf/p/14090586.html
Copyright © 2011-2022 走看看