快速排序(动画示例)

  • 动图

在这里插入图片描述

  • 由来

快速排序(Quicksort)是对冒泡排序的一种改进。 快速排序由C. A. R.Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

  • 简介

快速排序算法首先会在序列中随机选择一个基准值(pivot),然后将除了基准值以外的数分
为“比基准值小的数”和“比基准值大的数”这两个类别,再将其排列成以下形式。
[ 比基准值小的数] 基准值 [ 比基准值大的数]
接着,对两个“[ ]”中的数据进行排序之后,整体的排序便完成了。
对“[ ]”里面的数据 进行排序时同样也会使用快速排序。

  • 图解

一、场景:对 6 1 2 7 9 3 4 5 10 8 这 10 个数进行排序
二、思路:
先找一个基准数(一个用来参照的数),为了方便,我们选最左边的 6,希望将 >6 的放到 6 的右边,<6 的放到 6 左边。
如:3 1 2 5 4 6 9 7 10 8
先假设需要将 6 挪到的位置为 k,k 左边的数 <6,右边的数 >6
(1)我们先从初始数列“6 1 2 7 9 3 4 5 10 8 ”的两端开始“探测 ”,先从右边往左找一个 <6 的数,再从左往右找一个 >6 的数,然后交换。我们用变量 i 和变量 j 指向序列的最左边和最右边。刚开始时最左边 i=0 指向 6,最右边 j=9 指向 8 ;
在这里插入图片描述
(2)现在设置的基准数是最左边的数,所以序列先右往左移动(j–),当找到一个 <6 的数(5)就停下来。
接着序列从左往右移动(i++),直到找到一个 >6 的数又停下来(7);
(3)两者交换,结果:6 1 2 5 9 3 4 7 10 8;
在这里插入图片描述
(4)j 的位置继续向左移动(友情提示:每次都必须先从 j 的位置出发),发现 4 满足要求,接着 i++ 发现 9 满足要求,交换后的结果:6 1 2 5 4 3 9 7 10 8;
在这里插入图片描述
(5)目前 j 指向的值为 9,i 指向的值为 4,j-- 发现 3 符合要求,接着 i++ 发现 i=j,说明这一轮移动结束啦。现在将基准数 6 和 3 进行交换,结果:3 1 2 5 4 6 9 7 10 8;现在 6 左边的数都是 <6 的,而右边的数都是 >6 的,但游戏还没结束
在这里插入图片描述
(6)我们将 6 左边的数拿出来先:3 1 2 5 4,这次以 3 为基准数进行调整,使得 3 左边的数 ❤️,右边的数 >3,根据之前的模拟,这次的结果:2 1 3 5 4
(7)再将 2 1 抠出来重新整理,得到的结果: 1 2
(8)剩下右边的序列:9 7 10 8 也是这样来搞,最终的结果: 1 2 3 4 5 6 7 8 9 10 (具体看下图)
在这里插入图片描述
快速排序的每一轮处理其实就是将这一轮的基准数归位,当所有的基准数归位,排序就结束啦

  • Java实现

  • 方式一

public class QuickSort {
	public static void sort(int arr[], int low, int high) {
		int l = low;
		int h = high;
		int povit = arr[low];

		while (l < h) {
			while (l < h && arr[h] >= povit)
				h--;
			if (l < h) {
				arr[l] = arr[h];
				l++;
			}

			while (l < h && arr[l] <= povit)
				l++;

			if (l < h) {
				arr[h] = arr[l];
				h--;
			}
		}
		arr[l] = povit;
		print(arr);
		System.out.print("l=" + (l + 1) + "h=" + (h + 1) + "povit=" + povit + "\n");
		if (l - 1 > low)
			sort(arr, low, l - 1);
		if (h + 1 < high)
			sort(arr, h + 1, high);
	}

	static void print(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " -> ");
		}
		System.out.println();
	}

	public static void main(String[] args) {
		int low = 0;
		int high = 18;
		int[] arr = { 45, 43, 16, 4, 36, 36, 12, 17, 43, 12, 42, 7, 26, 23, 35, 4, 14, 21, 9 };
		QuickSort.sort(arr, low, high);
	}
}

参考:http://www.myexception.cn/other/2097152.html

### 回答1: 使用Python可以轻松实现这个功能。首先,使用 random.sample() 函数生成一个由长度为100的随机数列表组成的列表,然后使用 quickSort() 函数对该数组进行快速排序,并且使用 animation.FuncAnimation() 函数,可以通过动画演示排序过程。 ### 回答2: 要生成一个长度为100的随机数列表,可以使用Python的random模块中的randint函数,设置随机数范围为1到100。再利用列表推导式生成一个长度为100的随机数列表。 ``` import random random_list = [random.randint(1, 100) for _ in range(100)] ``` 接下来,可以使用快速排序算法对数组进行重新排序。快速排序是一种分治算法,通过选取一个基准元素,将小于基准的元素放在左边,大于基准的元素放在右边,然后递归地对左右两部分进行排序。 以下是一个使用快速排序算法对随机数列表排序的示例代码: ``` def quick_sort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) sorted_list = quick_sort(random_list) ``` 最后,可以使用Python的matplotlib库来进行可视化,将排序过程进行动画演示。使用pyplot模块绘制柱状图,并使用FuncAnimation函数按照快速排序的过程更新数据并显示动画。 ``` import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation fig, ax = plt.subplots() def update(frame): ax.clear() ax.bar(range(len(sorted_list)), sorted_list) ax.set_xlabel('Index') ax.set_ylabel('Value') ax.set_title('Quick Sort') ani = FuncAnimation(fig, update, frames=len(sorted_list), interval=100) plt.show() ``` 以上代码中的interval参数可以控制动画速度。每隔100毫秒更新一帧。您可以根据自己的需要进行调整。 通过运行这些代码,您将生成一个长度为100的随机数列表,并使用快速排序算法对其进行重新排序。在排序过程中,您将会看到一个动画效果,随着算法的进行,柱状图会显示出排序变化的过程。 ### 回答3: 首先,我们可以使用Python的random模块生成一个长度为100的随机数列表。代码如下: ```python import random nums = [random.randint(1, 1000) for _ in range(100)] ``` 接下来,我们实现快速排序算法。 快速排序通过选择一个基准元素,并将其余元素与基准元素进行比较和交换来排序数组。代码如下所示: ```python def quick_sort(nums, low, high): if low < high: # 根据基准元素划分数组 key_index = partition(nums, low, high) # 递归对划分后的两个子数组进行排序 quick_sort(nums, low, key_index - 1) quick_sort(nums, key_index + 1, high) def partition(nums, low, high): # 选择最后一个元素作为基准元素 key = nums[high] i = low - 1 # 将小于基准元素的元素交换到左侧 for j in range(low, high): if nums[j] < key: i += 1 nums[i], nums[j] = nums[j], nums[i] # 将基准元素交换到正确的位置上 nums[i + 1], nums[high] = nums[high], nums[i + 1] return i + 1 quick_sort(nums, 0, len(nums) - 1) ``` 最后,我们可以使用辅助库matplotlib来进行动画演示。代码如下: ```python import matplotlib.pyplot as plt import matplotlib.animation as animation fig, ax = plt.subplots() bar_rects = ax.bar(range(len(nums)), nums, align="edge") def update_fig(nums, rects, iterations): for rect, val in zip(rects, nums): rect.set_height(val) iterations[0] += 1 ax.set_title(f"Iteration {iterations[0]}") # 创建动画对象 anim = animation.FuncAnimation(fig, update_fig, frames=iterations, fargs=(bar_rects, iterations), interval=1) plt.show() ``` 运行以上代码即可生成一个长度为100的随机数列表,并使用快速排序对其进行重新排序,并通过动画进行演示。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值