快速排序学习 以数组中间值为轴

本文介绍了一个快速排序算法的具体实现过程,通过递归的方式对数组进行排序,并提供了完整的Java代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public static void main(String[] args) {
		int[] arrs = {15,13,17,19,6,34,9,55,9,3242,4};
		quickSearch(arrs,0,arrs.length-1);
		for (int i : arrs) {
			System.out.println(i);
		}
	}


	private static void quickSearch(int[] arrs, int left, int right) {
		// TODO Auto-generated method stub
		if(left<right){//首先判断角标是否越界
			int cen = arrs[(left+right)/2];//用变量将中间值记录下来,不记录下来会使中间值在下面代码执行过程中发生改变,因为数组在下面发生了重排,这时再取值就不准了
			int i = left-1;
			int j = right+1;
			while(true){
				while(arrs[++i]<cen);
				while(arrs[--j]> cen);
				if(i>=j)
					break;
				swap(arrs, i, j);
			}
			quickSearch(arrs,left,i-1);
			quickSearch(arrs,j+1,right);
		}
	}


	private static void swap(int[] arrs, int i, int j) {
		// TODO Auto-generated method stub
		int temp= 0;
		temp = arrs[i];
		arrs[i]= arrs[j];
		arrs[j]=temp;
	}

快速排序是一种高效的排序算法,它的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,然后分别对这两部分记录继续进行排序,直到整个序列有序。这里我将以C语言为例,给出一个基于数组中间值作为枢快速排序示例: ```c #include <stdio.h> // 选择枢元素 int partition(int arr[], int low, int high) { int pivot = arr[high]; // 取最右边的元素作为枢 int i = (low - 1); // i用于标记分割点 for (int j = low; j <= high - 1; j++) { if (arr[j] < pivot) { // 如果当前元素小于枢 i++; // 移动分割点并交换 swap(&arr[i], &arr[j]); } } swap(&arr[i + 1], &arr[high]); // 将枢放到正确的位置 return (i + 1); } // 交换两个元素 void swap(int* a, int* b) { int t = *a; *a = *b; *b = t; } // 快速排序函数 void quickSort(int arr[], int low, int high) { if (low < high) { int pi = partition(arr, low, high); // 对左侧和右侧递归进行排序 quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } // 测试用法 int main() { int arr[] = {9, 7, 5, 11, 12, 2, 14, 3, 10}; int n = sizeof(arr) / sizeof(arr[0]); printf("Original array: \n"); for (int i = 0; i < n; i++) printf("%d ", arr[i]); quickSort(arr, 0, n - 1); printf("\nSorted array: \n"); for (int i = 0; i < n; i++) printf("%d ", arr[i]); return 0; } ``` 这段代码首先定义了一个`partition`函数,用于找到枢位置并将数组分为两半。然后在`quickSort`函数中递归地对左右两侧进行排序。在`main`函数里,我们提供了一个数组实例来展示排序过程。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值