【杂谈】分治思想与快速排序

基本思想

所谓”分治“,顾名思义——”分而治之“,即是在处理一个复杂问题时,将其分化成多个简单问题,分别求解,以求出原问题的解
用式子表示为:

f(n) = f(1/n)+f(1/n)+……+f(1/n)


快速排序

在此以快速排序为例对分治策略进行解析。
快排的思想简单的来说,即是选取一个标准数,使得序列中的其他数按照与标准数的大小关系排列在其两侧,然后在其两侧重复这个过程,直到当次序列中只有被选取的标准数为止,完成排序,换而言之,即是一种分治策略,将复杂问题分化成n个简单小问题。
例如,有如下一组无序数列,将其进行升序排序:

58 23 78 69 12 36 46

首先我们选取出一个标准数,这里不对选取标准数的方法做过多讨论,此处我们采取选取数列中第一个数为标准数的方法,那么将其与序列中的最后一个数进行比较:

58 > 46

但是46在标准数的右边,故将标准数与该数互换位置,得到序列为:

46 23 78 69 12 36 58

再继续比较,比较位向标准数位置前进一步,将标准数与该数(23)进行比较:

23 < 58

且23已在标准数(58)的左边,故不发生变化,比较位继续推进,得到下一组比较:

78 > 58

但是78在标准数的左边,故互换位置,得到新序列:

46 23 58 69 12 36 78

下一步:

58 > 36
46 23 36 69 12 58 78

再下一步:

69 > 58
46 23 36 58 12 69 78

接着再一步:

58 > 12
46 23 36 12 58 69 78

再往下进行一步后,我们得到比较位与标准数在同一位置了,故此次比较结束,此时得到的序列中,标准数左边的数全都小于它,在其左边的数全都大于它,初次的排序完成了,这里得到了在最终排序结果中的标准数的正确位置,让我们进行一次分治对标准数左右两边的序列:

46 23 36 12
69 78

同样地重复这个过程,如此循环往复的进行分治,直到分出的序列中只有一个数为止,此时得到的,便是最终的升序序列了:

12 23 36 46 58 69 78


代码

这里给出Java的实现代码:


public class Main {
	
	public static void main(String[] args) {
		int a[] = {58,23,78,69,12,36,46};//无序数组
		q_sort(a,0,a.length-1);
		for(int i = 0;i < a.length;i++)System.out.print(a[i]+" ");//输出该数组查看结果
		System.out.println();
	}

//	创建快速排序方法,视 'i'为标准数,i与j为当次分治的起始位置与结束位置
	static void q_sort(int[] a,int i,int j) {
		if(i == j || i >= a.length || j >= a.length || i < 0 ||j < 0||i > j)return;//当次序列中只剩下一个元素时或者i,j不合法时结束分治
		int q = i,e = j;//记录序列的位置
		while(i != j){
			if((a[i] > a[j] && i < j) || (a[i] < a[j] && i > j)){
				a[i] = a[i] ^ a[j];
				a[j] = a[i] ^ a[j];
				a[i] = a[i] ^ a[j];
				
				i = i ^ j;
				j = i ^j;
				i = i ^ j;
			}
			j = j < i?++j:--j;
		}
		q_sort(a,q,i-1);//对标准数左序列进行分治
		q_sort(a,i+1,e);//对标准数右序列进行分治
	}
	
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,可以使用NI-VISA库来进行GPIB接口控制,下面是一个简单的示例代码。 ```java import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import visa32.*; public class GPIBControl { private static final int GPIB_ADDRESS = 1; // GPIB地址 private static final int BUFFER_SIZE = 1024; // 缓冲区大小 public static void main(String[] args) { // 初始化NI-VISA库 VisaLibrary visaLibrary = (VisaLibrary) Native.loadLibrary("visa32", VisaLibrary.class); visaLibrary.viOpenDefaultRM(); // 打开GPIB设备 String deviceName = "GPIB0::" + GPIB_ADDRESS + "::INSTR"; Pointer instrument = new Memory(GpibLibrary.ViUInt32.SIZE); visaLibrary.viOpen(visaLibrary.getResourceManager(), deviceName, new GpibLibrary.ViAccessMode(GpibLibrary.VI_NO_LOCK), new GpibLibrary.ViUInt32(0), instrument); Pointer session = instrument.getPointer(0); // 设置超时时间 visaLibrary.viSetAttribute(new GpibLibrary.ViSession(session), new GpibLibrary.ViAttrState(GpibLibrary.VI_TMO_VALUE), new GpibLibrary.ViUInt32(5000)); // 写入命令 String command = "*IDN?"; visaLibrary.viWrite(new GpibLibrary.ViSession(session), command.getBytes(), new GpibLibrary.ViUInt32(command.length()), new IntByReference()); // 读取响应 byte[] buffer = new byte[BUFFER_SIZE]; visaLibrary.viRead(new GpibLibrary.ViSession(session), buffer, new GpibLibrary.ViUInt32(BUFFER_SIZE), new IntByReference()); String response = new String(buffer).trim(); System.out.println("Instrument response: " + response); // 关闭设备 visaLibrary.viClose(new GpibLibrary.ViSession(session)); visaLibrary.viClose(visaLibrary.getResourceManager()); } } ``` 这个示例代码使用NI-VISA库来打开GPIB设备,设置超时时间,写入命令并读取响应。需要注意的是,GPIB_ADDRESS变量需要设置为实际的GPIB地址,BUFFER_SIZE变量可以根据需要进行调整。 在实际应用中,需要根据仪器的通信协议进行编写代码,例如使用SCPI命令进行控制。希望这个示例代码能够对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值