交互设计算法基础(3) - Quick Sort

 1 int pivotIndex, pivot, swapIndex;
 2
 3 void swap(int[] arr, int x, int y) {
 4   int temp = arr[x];
 5   arr[x] = arr[y];
 6   arr[y] = temp;
 7 }
 8
 9 void quickSort(int[] arr, int start, int end) {
10   if (end <= start) return;
11
12   pivotIndex = (start + end)/2;
13   pivot = arr[pivotIndex];
14   swap(arr, pivotIndex, end);
15   swapIndex = start;
16   for (int i = start; i < end; i++) {
17     if (arr[i] <= pivot) {
18       swap(arr, i, swapIndex);
19       ++swapIndex;
20     }
21   }
22   swap(arr, swapIndex, end);
23
24   quickSort(arr, start, swapIndex-1);
25   quickSort(arr, swapIndex+1, end);
26 }
27
28 void draw() {
29   noLoop();
30   int[] arr = {10, 5, 2, 3};
31   quickSort(arr, 0, arr.length-1);
32   println(arr);
33 }

快速排序,说白了就是快啦,不过有两种实现方式,一种普通,一种In-place,后面的比前面的占用较少空间。

快排用分治法解决。

最佳时间复杂度:O(nlog n)

平均时间复杂度:O(nlog n)

最差时间复杂度:O(n2)

空间复杂度:一般版本O(n),In-place O(log n)

时间: 2024-10-11 13:37:12

交互设计算法基础(3) - Quick Sort的相关文章

交互设计算法基础(4) - Hash Table

1 2 import java.util.Map; 3 4 // Note the HashMap's "key" is a String and "value" is an Integer 5 HashMap<String,Integer> hm = new HashMap<String,Integer>(); 6 7 // Putting key-value pairs in the HashMap 8 hm.put("Ava&

Collection of algorithm for sorting. 常见排序算法集(三) —— Quick Sort

Quick Sort 快排,一个排序方法能直接享受这样的名称殊荣,呵呵,可见其威力与重要性. 其中最重要的思想就是 "分治"-- divide and conquer ! 这里排序用到的思想极其简单,却是很实用的!小孩子都会的简单想法. 先把所有数据分成三个部分. 在所有数据中选取某一元素X,比X小的放左边,比X大的放右边. 接着把这一思想同样分别施加在X元素的左边和右边部分,同样继续划分,选出一个元素X' 比X'小的放左边比X'大的放右边. 继续施加这种划分策略,直到划分的元素很少(

排序算法之快速排序(Quick Sort) -- 适用于Leetcode 75 Sort Colors

Quick Sort使用了Divide and Concur的思想: 找一个基准数, 把小于基准数的数都放到基准数之前, 把大于基准数的数都放到基准数之后 Worst case: O(n^2) Average case: O(nlogN) 步骤: 初始的数组 Array a[]: 0 1 2 3 4 5 6 7 8 9 51 73 52 18 91 7 87 73 48 3 基准数: X = a[0] = 51 i 的值: i = 0 j 的值: j = 9 (a.length) Step 1:

基础算法之快速排序Quick Sort

原理 快速排序(Quicksort)是对冒泡排序的一种改进. 从数列中挑出一个元素,称为"基准"(pivot); 排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边).在本次排序退出之后,该基准就处于数列的中间位置.这个称为分区(partition)操作; 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序. 例子 将无序数组[3,6,4,2,5,1]进行快速排序 1),先把第一项[3]取出来作为基准依次

交互设计的域与界

本文主要讨论了交互设计的研究领域和有域无界的交叉性学科特征.交互设计指向事件的创造,其设计对象是一个随着时间变化的.使用的过程,因此,行为.内容和形式成为交互设计的三个要素.交互设计是随着信息技术的发展而发展的,是一门交叉性很强的学科,需要多个学科合作来共同完成交互设计的过程,与此同时,面对市场和技术发展需求,交互设计开始走向系统整合的模式,力图提供更完整的解决方案. 交互设计诞生在工业设计.传达设计.人机交互.认知心理学.人类学和社会学等学科交叉的领域,是一门新兴的.解决如何使用信息化产品的设

什么是交互设计

交互设计,又称互动设计,英文Interaction Design, 缩写为IxD,是定义.设计人造系统的行为的设计领域. 人造物:即人工制成物品,例如,软件.移动设备.人造环境.服务.可佩带装置以及系统的组织结构. 交互设计在于定义人造物的行为方式(the interaction,即人工制品在特定场景下的反应方式)相关的界面. 交互设计师首先进行用户研究相关领域,以及潜在用户,设计人造物的行为,并从有用性,可用性和情感因素等方面来评估设计质量. 产生原因 交互设计在任何的人工物的设计和制作过程里

笔试算法题(54):快速排序实现之单向扫描、双向扫描(single-direction scanning, bidirectional scanning of Quick Sort)

议题:快速排序实现之一(单向遍历) 分析: 算法原理:主要由两部分组成,一部分是递归部分QuickSort,它将调用partition进行划分,并取得划分元素P,然后分别对P之前的部分和P 之后的部分递归调用QuickSort:另一部分是partition,选取划分元素P(随机选取数组中的一个元素,交换到数组末尾位置),定义两个标记 值left和right,随着划分的进行,这两个标记值将数组分成三部分,left之左的部分是小于划分元素P的值,left和right之间的部分是大 于等于划分元素P的

笔试算法题(55):快速排序实现之非递归实现,最小k值选择(non-recursive version, Minimal Kth Selection of Quick Sort)

议题:快速排序实现之五(非递归实现,短序列优先处理,减少递归栈大小) 分析: 算法原理:此算法实现适用于系统栈空间不足够快速排序递归调用的需求,从而使用非递归实现快速排序算法:使用显示下推栈存储快速排序中的每一次划分结果 (将left和right都压入堆栈),并且首先处理划分序列较短的子序列(也就是在得到一次划分的左右部分时,首先将长序列入栈,然后让段序列入栈), 这样可以保证当快速排序退化的线性效率的时候,栈大小仍旧在㏒N范围内.算法策略类似于最小子树优先遍历规则: 弱势:当序列已经就绪,每次

算法 quick sort

// -------------------------------------------------------------------------------------------------------------------- // // // Respect the work. // // </copyright> // <summary> // // The quick sort. // // 高速排序(QuickSort)是对冒泡排序的一种改进.它的基本思想是:通