分治算法——快速排序、归并排序算法(Java实现)

news/2024/5/17 17:42:52 标签: Java, 分治算法, 算法, 归并排序, 快速排序

排序问题

对序列42,96,23,89,48,75,36,30,57,61用快速排序归并排序算法,从小到大排序。

算法实现:

import java.util.Arrays;
/**
 * 快速排序
 * @author 光
 *
 */
public class QuickSort {

	public static int getMiddle(int[] intArr, int low, int high) {
		int tmp = intArr[low];    //数组的第一个作为中轴数
		while (low < high) {
			while (low < high && intArr[high] > tmp) {
				high--;
			}
			intArr[low] = intArr[high];   //比中轴数小的记录移到低端
			while (low < high && intArr[low] < tmp) {
				low++;
			}
			intArr[high] = intArr[low];   //比中轴大的记录移到高端
		}
		intArr[low] = tmp;              //中轴记录到尾
		return low;                   //返回中轴的位置
	}
	
	public static void _quickSort(int[] intArr, int low, int high) {  
        if (low < high) {  
            int middle = getMiddle(intArr, low, high);  //将intArr数组进行一分为二  
            _quickSort(intArr, low, middle - 1);        //对低字表进行递归排序  
            _quickSort(intArr, middle + 1, high);       //对高字表进行递归排序  
        }  
    }
	public static void quick(int[] str) {  
        if (str.length > 0) {    //查看数组是否为空  
            _quickSort(str, 0, str.length - 1);  
        }  
    } 
	
	public static void main(String[] args) {  
          
         int[] intArr={42,96,23,89,48,75,36,30,57,61}; 
         System.out.println("old: "+Arrays.toString(intArr));
         quick(intArr); 
         System.out.println("new: "+Arrays.toString(intArr));
    } 
}
import java.util.Arrays;
/**
 * 归并排序
 * @author 光
 *
 */
public class Merge {
	 
    private static void sort(int[] array,int i,int j) {
        if(i<j){
            int middle=(i+j)/2;
            //递归处理相关的合并事项
            sort(array,i,middle);
            sort(array,middle+1,j);
            merge(array,i,middle,j);           
        }
    }
    /**
     * 合并相关的数组内容
     * 同时使合并后的数组仍然有序
     *
     */
    private static void merge(int[] array, int i, int middle, int j) {
        //创建一个临时数组用来存储合并后的数据
        int[] temp=new int[array.length];
        int m=i;
        int n=middle+1;
        int k=i;
        while(m<=middle&&n<=j){
            if(array[m]<array[n])
                temp[k++]=array[m++];
            else
                temp[k++]=array[n++];
        }
        //处理剩余未合并的部分
        while(m<=middle){
            temp[k++]=array[m++];
        }
        while(n<=j){
            temp[k++]=array[n++];
        }
        //将临时数组中的内容存储到原数组中
        while(i<=j){
            array[i]=temp[i++];
        }
    }

    public static void main(String[] args) {
    	//需要进行排序的数组
    	int[] array={42,96,23,89,48,75,36,30,57,61};
    	//输出原数组的内容
    	System.out.println("old: "+Arrays.toString(array));
    	//归并排序操作
    	sort(array,0,array.length-1);
    	//输出排序后的相关结果
    	System.out.println("new: "+Arrays.toString(array));
    }
}

输出结果:

old: [42, 96, 23, 89, 48, 75, 36, 30, 57, 61]
new: [23, 30, 36, 42, 48, 57, 61, 75, 89, 96]




http://www.niftyadmin.cn/n/1413224.html

相关文章

Android开发者指南(22) —— Accessing Resources

前言 本章内容为Android开发者指南的Framework Topics/Application Resources/Accessing Resources章节&#xff0c;译为"资源调用"&#xff0c;版本为Android 3.2 r1&#xff0c;翻译来自&#xff1a;"CodeGuy"&#xff0c;欢迎访问他的博客&#xff1a;&…

分治算法——循环赛日程安排问题(Java实现)

循环赛日程安排问题 设有16个运动员将进行网球循环赛。现要设计一个满足以下要求的比赛日程表&#xff1a;⑴ 每个选手必须与其它15个选手各赛一场&#xff0c;⑵ 每个选手一天只能赛一场&#xff0c;⑶ 循环赛进行15天。 算法实现&#xff1a; package practice; import java…

HGOI 20190519 题解

脑补了一下今天的比赛难度和之前zju-lzw出的题目画风迥异。 难度完全不是一个水平的好伐。 Probem A palindrome 给出一个$n$个元素的数组&#xff0c;可以任意指定一个数字$m$让所有$a_i a_i \% m$。 使得最终得出的数组成为形如$\{1,2,3,2,1\}$的回文数组&#xff0c;求最大…

动态规划算法——矩阵连乘问题(java实现)

矩阵连乘问题&#xff1a; 求矩阵A1(53)、A2(34)、A3(47)、A4(72)、A5(23)和A6(36)连乘的最佳计算次序。 算法实现&#xff1a; package practice; /*** array[i][j]* 表示Ai...Aj的最佳计算次序所对应的相乘次数 即存放各子问题的最优值* s[i][j]k* 表示Ai...Aj这(j-i1)…

获取JavaScript用户自定义类的类名称

我们知道&#xff0c;虽然JavaScript是基于对象(object-based)的语言。但是使用其原形(prototype)特性&#xff0c;我们完全可以实现十分sexy的OO编成框架&#xff0c;这个可以看看经典论坛的文章基本上实现 javascript 的 OOP (0423版)。 不过虽然我们实现了类这种概念&…

HDU4336 Card Collector

vjudge嘟嘟嘟 看一眼数据范围&#xff0c;发现可以状压。 转移的话&#xff0c;就枚举接下来抽哪一张卡&#xff0c;发现可能转移到别的状态&#xff0c;可能还是这个状态。把方程列出来移项&#xff0c;就变成了\(a * x_i 1 p_j * x _j p_k * x _ k \ldots\)。然后我们逆推…

ArcGis之popup列表字段自定义

ArcGis之popup列表字段自定义 featureLayer图层中可以使用popupTemplate属性添加弹窗。 API&#xff1a;https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-FeatureLayer.html#popupTemplate 1.number格式化 {fieldName: 面积,label: 面积/m,format:…

【Swift】iOS开发历险记(一)

前言 边开发边学习&#xff0c;边攒经验&#xff0c;汇总一下记录到这里 声明 欢迎转载&#xff0c;但请保留文章原始出处:) 博客园&#xff1a;http://www.cnblogs.com 农民伯伯&#xff1a; http://over140.cnblogs.com 1、隐藏/显示密码功能 光设置secureTextEntry还不行&…