java 快速排序 插入排序 选择排序

时间:2021-03-13 22:06:50
package 未做_快速排序_归并排序_二分查找_等排序;
/*
 * 快速排序
 * 使用递归方法
 * 把数组拆分为两个子数组加上一个基准元素: 
 * 1.选取最后一个元素作为基准元素,index变量记录最近一个小于基准元素的元素所在的位置,
 * 初始化为start- 1,发现新的小于基准元素的元素,index加1。
 * 从第一个元素到倒数第二个元素,依次与基准元素比较,
 * 小于基准元素,index加1,交换位置index和当前位置的元素。
 * 循环结束之后index+1得到基准元素应该在的位置,交换index+1和最后一个元素。
 * 2.分别排序[start, index], 和[index+2, end]两个子数组
 * 
 */
public class QuickSort {
	public static void main(String args[]){
		int[] arr = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3 };  
		
		quictSort(arr);
		print(arr);
		
	}
	
	public static void print(int[] arr){
		for(int i=0;i<arr.length;i++){
			System.out.print(arr[i]);
			System.out.print(",");
		}
	}
	public static void jiaohuan(int[] arr, int index1, int index2){
		int temp = arr[index1];
		arr[index1] = arr[index2];
		arr[index2] = temp;
	}
	
	public static void quictSort(int[] arr){
		quictSort(arr, 0 , arr.length-1);
	}
	public static void quictSort(int[] arr, int start, int end){
		if(arr == null || end<2){
			return ;//若只有1个元素或没有元素,没必要排序,停止程序
		}
		
		int part = partition(arr, start , end);//求基准元素应该所在的位置
		if(part == start){
			quictSort(arr, part+1, end);//递归处理 part之后的数组元素
		}else if(part == end){
			quictSort(arr, start, part-1);//递归处理 part之前的数组元素			
		}else{
			quictSort(arr, start, part-1);//递归处理 part之前的数组元素			
			quictSort(arr, part+1, end);//递归处理 part之后的数组元素			
		}
		
	}
	public static int partition(int[] arr, int start, int end){
		int value = arr[end];//选取最后一个元素为基准元素
		int index = start-1;//为了从start---end-1 进行比较 每次index+1;
		
		for(int i=start; i<end; i++){
			if(arr[i]<value){//若元素小于最后一个元素的值 则index +1 继续向前走
				index++;
				if(index != i){//交换当前index 与i位置的值
					jiaohuan(arr, index, i);
				}
			}
			
		}
		if((index+1) != end ){
			jiaohuan(arr, index+1, end);			
		}
		return index+1;//得到基准元素所在的位置
	}
	
}

package 未做_快速排序_归并排序_二分查找_等排序;
/* 插入排序
 * 升序
 * 1.选取第一个元素为基准元素
 * 2.若第二个元素小于基准元素,则把第二个元素插入到第一个元素的前面,把第二个元素作为基准元素
 * 3.直到所有元素插入为止
 */
public class insertSort {
	public static void main(String args[]){
		int[] arr = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3 };
		
		Sort(arr);
		print(arr);
		
	}
	
	public static void Sort(int[] arr){
		if(arr == null || arr.length<2){
			return ;
		}
		for(int i=1;i<arr.length;i++){
		//从第i个元素开始与i之前的元素进行比较 若当前元素小于i之前的元素 则进行交换值,直到交换到第0个元素为止
			int value = arr[i];
			int position = i;//记录当前元素的位置
			for(int j=i-1;j>=0;j--){
				if(arr[j]>value){
					arr[j+1]=arr[j];//若当前值前面的值大于当前值,则把前面的值赋给后面的值
					position-=1;//记录value应该在的位置
				}else{
					break;
				}
			}
			arr[position] = value;//把当前值放在当前位置上
		}
	}
	public static void print(int[] arr){
		for(int i=0;i<arr.length;i++){
			System.out.print(arr[i]);
			System.out.print(",");
		}
	}
}

package 未做_快速排序_归并排序_二分查找_等排序;
//选择排序
public class SelectSort {
	public static void main(String args[]){
		int[] arr = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3 };
		Sort(arr);
		print(arr);
		
	}
	
	public static void Sort(int[] a) {  
        if (a == null || a.length <= 0) {  
            return;  
        }  
        for (int i = 0; i < a.length; i++) {  
            int min = i; /* 将当前下标定义为最小值下标 */  
  
            for (int j = i + 1; j < a.length; j++) {  
                if (a[min] > a[j]) { /* 如果有小于当前最小值的关键字 */  
                    min = j; /* 将此关键字的下标赋值给min */  
                }  
            }  
            if (i != min) {/* 若min不等于i,说明找到最小值,交换 */  
                int tmp = a[min];  
                a[min] = a[i];  
                a[i] = tmp;  
            }  
        }  
    }  
	public static void print(int[] arr){
		for(int i=0;i<arr.length;i++){
			System.out.print(arr[i]);
			System.out.print(",");
		}
	}
}