java 实现部分排序算法

java 实现部分排序算法

选择排序

1,设一个第一位为最大值
2,遍历列表与第一位比较,如果更大则交换
3,重复1

冒泡排序

双重循环解决

插入排序

  • 直接插入排序
    思想是分为有序序列和无序序列
    1,设第一个有序
    2,从第二个开始,从右到左扫描有序序列,当碰到第一个小于有序序列的时候,腾出位置,然后插入
    3,重复2
    注意,记录有序序列长度
  • 折半插入排序
    递归折半查找有序序列
    注意,折半查找溢出

归并排序

在这里插入图片描述

快速排序

在这里插入图片描述

附录


public class Main {

    public static void main(String args[]) {
	int [] test = {2, 5, 6, 3, 1, 8, 4, 9};
	quick_sort_result(test);
	printArray(test);
    }
    
    /* 排序 */
    public static void quick_sort_result(int [] a) {
	quickSort(a, 0, a.length-1);
    }
    
    /* 快速排序 */
    public static int [] quickSort(int [] a, int start, int end) {
	if(start < end) {
	    int base_index = base(a, start, end);
		
	    // 左边递归快排
	    quickSort(a, start, base_index-1);
	    
	    // 右边递归快排
            quickSort(a, base_index+1, end);
	}
	
	
	return a;
	
	
	
    }
    
    /* 中轴元素 */
    public static int base(int [] a, int start, int end) {
	int base_num = a[start];
	
	int i = start+1, j = end;
	
	while(true){
	    

	    
	    while(a[i] < base_num) { // 左边扫描
		i++;
	    }
	    
	    while(a[j] > base_num) { // 右边扫描
		j--;
	    }
	    
	    if(i > j) {
		break;
	    }
	    
	    swap(a, i, j);
	    printArray(a);
	    
	}
        	

	swap(a, start ,j);
	printArray(a);
	return j;
	

    }

    /* 交换两个数 */
    public static void swap(int [] arr, int i, int j) {
	int temp;
	temp = arr[i];
	arr[i] = arr[j];
	arr[j] = temp;
    }
    
    /* 归并排序 */
    public static int [] mergeSort(int[] a) {
        	if(a.length < 2) {
        	    return a;
        	}
	    	
		
		int middle_index = a.length / 2;
		int [] left = new int[middle_index];
		int [] right = new int[a.length - middle_index];
		
		for(int i=0; i< middle_index; i++) {
		    left[i] = a[i];
		}
		
		for(int j=middle_index; j< a.length; j++) {
		    right[j-middle_index] = a[j];
		}
		
		return merge(mergeSort(left), mergeSort(right));
    }
    
    /* 归并操作 */
    public static int [] merge(int [] left, int [] right) {

	int[] result = new int[left.length + right.length];
        int i = 0;
        while (left.length > 0 && right.length > 0) {
            if (left[0] <= right[0]) {
                result[i++] = left[0];
                left = Arrays.copyOfRange(left, 1, left.length);
            } else {
                result[i++] = right[0];
                right = Arrays.copyOfRange(right, 1, right.length);
            }
        }

        while (left.length > 0) {
            result[i++] = left[0];
            left = Arrays.copyOfRange(left, 1, left.length);
        }

        while (right.length > 0) {
            result[i++] = right[0];
            right = Arrays.copyOfRange(right, 1, right.length);
        }
        printArray(result);
        return result;
	
    }
    
    /* 冒泡排序 */
    public static void bubbleSort(int [] a) {
	int temp;
	for(int i=0; i< a.length; i++) { // 浮上去的个数
	    for(int j=0; j< a.length-1-i; j++) {
		if(a[j] > a[j+1]) {
		   temp = a[j];
		   a[j] = a[j+1];
		   a[j+1] = temp;
		}
	    }
	}
    }

    
    /* 插入排序 */
    public static void insertSort(int [] a) {  // 从小到大
	int insertNum;
	
	for(int i=1; i< a.length; i++) {
	    insertNum = a[i];
	    int j = i-1;
	    while(j >= 0 && insertNum < a[j]) {
		a[j+1] = a[j];
		j--;
	    }
	    a[j+1] = insertNum;
	}
	
	
    }
    
    /* 折半插入排序 */
    public static void insertSort_binary(int [] a) {  // 从小到大
	int insertNum;
	
	for(int i=1; i< a.length; i++) {
	    insertNum = a[i];
	    int j = i-1;
	    int insert_index = binary_find_recursion(a, insertNum, 0, j); // 找到交换的位置
	
    	    while(j>=insert_index) { // 然后从该位置起后移一位
    		a[j+1] = a[j];
    		j--;
    	    }
    	    
    	    a[insert_index] = insertNum;  // 覆盖
        	    

	}
	
	
    }
    
    /* 折半查找 */
    public static int binary_find_recursion(int [] a, int number, int low_index, int high_index) {
	int mid_index = low_index+(high_index-low_index)/2;  // 防止溢出
	
	
	if(low_index > high_index) {
	    return mid_index;
	}
	else {
        	if(number > a[mid_index]) { // 去右边区间查找
        	    return binary_find_recursion(a, number, mid_index+1, high_index);
        	}
        	else{ // 去左边区间查找
        	    return binary_find_recursion(a, number, low_index, mid_index-1);
        	}
	}
    }
    
    
    /* 打印数组 */
    public static void printArray(int [] a) {
	for(int i=0; i< a.length; i++) {
	    System.out.printf("%d\t", a[i]);
	}
	System.out.println("\n");
    }
    
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值