部分工具需要较大屏幕以获得最佳体验,建议在平板或电脑上使用。
正在打开工具…
部分工具需要较大屏幕以获得最佳体验,建议在平板或电脑上使用。
正在打开工具…
红、绿、蓝保留各算法的比较、枢轴或移动标记;完成时绿色扫描数组。音高随数值升高。操作:0;比较:0。
快速排序把数据分成较小的分区,递归排序各分区,直到整个结构有序。
分区围绕枢轴进行:比枢轴大的元素放到右侧,较小的放到左侧,形成两个分区,再递归执行同一过程。
围绕枢轴划分的策略称为分治。它效率较高,也被归并排序等算法使用。
void swap(int *a, int *b) {
int t = *a;
*a = *b;
*b = t;
}
int partition(int array[], int low, int high) {
int pivot = array[high];
int i = (low - 1);
for (int j = low; j < high; j++) {
if (array[j] <= pivot) {
i++;
swap(&array[i], &array[j]);
}
}
swap(&array[i + 1], &array[high]);
return (i + 1);
}
void quickSort(int array[], int low, int high) {
if (low < high) {
int pi = partition(array, low, high);
quickSort(array, low, pi - 1);
quickSort(array, pi + 1, high);
}
}排序按数值顺序、字典顺序等关系重新排列数据,是计算机科学中广泛使用的操作。长期以来,人们持续提出更快的方法;不同算法各有特点,通常从时间和空间复杂度衡量。
渐近记号 O、Θ、Ω 分别表示上界、紧确界和下界;n 表示元素数量。常见比较排序包括 n·log n 量级和二次量级。前者并非单纯 log n;快速排序平均时间通常为 O(n·log n),空间受递归与实现影响。原首页将这一类简称为“对数”,并把快速排序时间和空间都写为 O(n·log n),这里作出纠正。冒泡排序一般为 O(n²)。还需区分最好、平均和最坏情况。
算法可能难以理解。观察元素的移动与颜色、听取数值对应的音高,可以帮助理解它们的运行过程。
渐近记号参考使用 JavaScript 编写异步入口函数,接收一个 elements 数组,并按升序原地排序,返回 undefined。若需要其他参数,可用入口函数包装实际算法。可以声明多个函数和类;不使用外部模块导入。在入口名称框中填写主函数名。
计算在工作线程中执行;elements 保留原接口所需的元素对象、style.height、style.left 和 classList.add/remove,以这些数据驱动原生图形。它们不连接页面 DOM。停止可终止无限循环;编辑程序可本地下载。原作者的代码投稿服务未接入平台,下载不能视为已投稿。
编辑器支持 Tab/Shift+Tab 缩进与取消缩进、Ctrl+/(macOS 为 ⌘+/)切换行注释、自动闭合和匹配括号、F11 编辑器全屏及 Esc 退出。自定义程序可使用全部上述接口;错误会保留当前数据并显示原因。
Daniel Scanu、Tommaso Tovoli、Odd Elof Larsson。联系:danielscanu45@outlook.it、tovoli.tommaso@gmail.com、larsson.odd@gmail.com。