数组排序——快速排序

数组排序——快速排序


1、数组排序之快速排序

    一趟快速排序的算法是:  

        1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;

        2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0];

        3)从j开始向前搜索,即由后开始向前搜索(j=j-1即j--),找到第一个小于key的值A[j],A[i]与A[j]交换;

        4)从i开始向后搜索,即由前开始向后搜索(i=i+1即i++),找到第一个大于key的A[i],A[i]与A[j]交换;

        5)重复第3、4、5步,直到 I=J;

       (3, 4 步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。找到并交换的时候i、 j指针位置不变。另外,当i=j这过程一定正好是i+或j-完成的最后令循环结束。)

2、代码演示

package cn.itcast_01;

public class ArraySort_quickSort {
	public static void main(String[] args) {
		// 定义一个数组
		int[] arr = { 11, 3, 454, 231, 87, 334, 0, -55, 2, 66 };
		// int[] arr = { 24 };
		// int[] arr = {};
		System.out.println("排序前:");
		printArray(arr);

		// 调用冒泡排序算法
		int n = arr.length;
		quickSort(arr, 0, n - 1);

		System.out.println("排序后:");
		printArray(arr);
	}

	// 快速排序法 quickSort()+partition()
	// 一次划分算法
	public static int partition(int r[], int first, int end) {
		int i = first; // 指向头
		int j = end; // 指向尾
		int temp = 0; // 辅助变量
		while (i < j) // i==j时跳出循环
		{
			while (i < j && r[i] < r[j]) // 右侧扫描
				j--;
			if (i < j) {
				temp = r[i];
				r[i] = r[j];
				r[j] = temp;
				i++;
			}
			while (i < j && r[i] < r[j]) // 左侧扫描
				i++;
			if (i < j) {
				temp = r[i];
				r[i] = r[j];
				r[j] = temp;
				j--;
			}
		}
		return i;
	}

	// 快速排序递归算法
	public static void quickSort(int r[], int first, int end) {
		int pivot = 0;
		if (first < end) {
			pivot = partition(r, first, end);
			quickSort(r, first, pivot - 1); // 前半部分递归
			quickSort(r, pivot + 1, end); // 后半部分递归
		}
	}

	// 数组遍历
	public static void printArray(int[] arr) {
		System.out.print("[");
		for (int i = 0; i < arr.length; i++) {
			if (i == arr.length - 1) {
				System.out.print(arr[i]);
			} else {
				System.out.print(arr[i] + ", ");
			}
		}
		System.out.println("]");
	}
}



  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
排序算法中,有许多算法的时间复杂度为O(n log2n),其中最常见的三种是快速排序、归并排序和堆排序快速排序是一种基于分治法的排序算法,平均时间复杂度为O(n log2n) [1。归并排序也是一种分治算法,它将数组递归地分成两部分,然后将这两部分排序合并,时间复杂度同样为O(n log2n) [2。堆排序利用二叉堆的性质,在最坏情况下的时间复杂度也是O(n log2n) [1。 归并排序的算法思路是首先将数组分成两部分,然后分别对这两部分进行排序,最后再将两部分合并。具体的实现代码可以参考。归并排序的特点是时间复杂度稳定且较快,但空间消耗较大,空间复杂度为O(n)。它也是一种稳定的排序算法,即相等的元素在排序后的序列中相对位置不变。 总结来说,归并排序是一种时间复杂度为O(n log2n)的排序算法,它通过将数组分成两部分并递归地对每部分进行排序,然后将排好序的两部分合并得到最终的有序序列。在算法性能和稳定性方面,归并排序是一种非常实用的排序算法 [3。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [排序算法大比拼(2.1)——时间O(n log2n)篇之归并排序](https://blog.csdn.net/yueyuedog/article/details/118853765)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值