快排之单向扫描分区法

快排之单向扫描分区法

public class 快排之单向扫描分区 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = { 9, 8, 7, 6, 5, 0, 4, 8, 3, 2, 8, 7, 10 };
		quickSort(arr, 0, arr.length - 1);
		for (int num : arr) {
			System.out.print(num + " ");
		}
	}

	private static void quickSort(int[] arr, int begin, int end) {
		if (begin >= end) {
			return;
		}
		int indexOfMid = partition(arr, begin, end);// 分区 返回中位索引
		quickSort(arr, begin, indexOfMid - 1);
		quickSort(arr, indexOfMid + 1, end);
	}

	private static int partition(int[] arr, int begin, int end) {
		int pivot = arr[begin];
		int sp = begin;
		int bigger = end;
		while (sp <= bigger) {
			if (arr[sp] <= pivot) {
				sp++;
			} else {
				swap(arr, sp, bigger);
				bigger--;
			}
		}
		swap(arr, begin, bigger);
		return bigger;
	}

	private static void swap(int[] arr, int i, int j) {
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}
}
### 磁盘调度算法中的双向扫描单向扫描 #### 双向扫描 (SCAN) 双向扫描算法,也称为电梯算法,在磁头移动方向上类似于电梯的工作方式。当磁头到达最内层或最外层时会改变方向继续服务其他请求。这种方式可以有效减少磁臂频繁来回切换造成的机械磨损并提高效率。 - **工作原理**:磁头按照当前设定的方向依次访问各个磁道上的读写请求直到达到边界位置再反转方向重复上述过程。 ```python def scan_algorithm(requests, head_position): requests.sort() index = bisect.bisect_left(requests, head_position) # 向右遍历 rightward = sorted([r for r in requests[index:] if r >= head_position]) # 向左遍历回到起始处重新开始 leftward = sorted([r for r in requests[:index] if r < head_position], reverse=True) sequence = [] while True: for i in range(len(rightward)): yield from move_to(head_position, rightward[i]) # 移动到下一个目标磁道 sequence.append(rightward.pop(i)) if not any((rightward, leftward)): break for j in reversed(range(len(leftward))): yield from move_to(head_position, leftward[j]) sequence.append(leftward.pop(j)) if not any((rightward, leftward)): break return sequence ``` #### 单向扫描 (CSCAN) 为了避免某些情况下进程长时间得不到响应的问题,提出了单向扫描(CSCAN)算法作为改进方案。在这种模式下,磁头始终沿固定的一个方向前进,一旦抵达末端则立即返回起点而不做任何停留来处理新产生的请求;这使得所有等待队列里的任务都能获得相对公平的服务机会[^1]。 - **工作原理**: 磁头仅朝单一指定路径行进,完成一轮完整的圆周运动之后才会转向相反一侧执行相同操作。因此即使存在靠近当前位置却位于反向侧的目标也不会被打断而优先考虑更远端的任务。 ```python def cscan_algorithm(requests, head_position): max_cylinder = max(requests)+10 # 假设最大柱面数大于实际需求 extended_requests = list(set(requests)) + [max_cylinder] start_index = bisect.bisect_right(extended_requests, head_position) forward_slice = extended_requests[start_index:] backward_slice = extended_requests[:start_index][::-1] service_order = [] def serve(slice_): nonlocal head_position slice_.sort() # 对切片内的请求按顺序排列 for target in slice_: distance = abs(target - head_position) print(f'Moving {distance} cylinders to cylinder {target}') head_position = target service_order.append(target) serve(forward_slice) serve(backward_slice[:-1]) # 排除最后一个虚拟的最大柱面 return service_order ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值