快速排序之算法

一、定义
快速排序是一种基于比较的排序算法,通过选取平均数将整个数据集划分成两部分,并把所有小于平均数的元素移动到平均数左边;在左半部分重复上述操作,直到左边部分的排序完成后,对右边部分执行相同的操作。
二、算法思想
先确定一个“支点”,将所有小于“支点”的值都放在该点的左侧,大于“支点”的值都放在该点的右侧,然后对左右两侧不断重复这个过程,直到所有排序完成。
三、具体实现

function quickSort1(arr) {
  var len = arr.length;
  if (len < 2) {
    return arr;
  }
  var midIndex = Math.floor(len / 2); // 中间元素的索引值
  var baseValue = arr.splice(midIndex, 1); // 基准值

  var left = []; // 保存小于基准值元素
  var right = []; // 保存大于或等于基准值元素

  for (var i = 0; i < arr.length; i++) {
    if (arr[i] < baseValue) {
      left.push(arr[i]);
    } else {
      right.push(arr[i]);
    }
  }
  return quickSort1(left).concat(baseValue, quickSort1(right));
}
console.log(quickSort1([3,115,9,2,11,6,3,19]));
function quickSort2(arr, left, right) {
  var len = arr.length,
      partitionIndex,
      left = typeof left != ‘number‘ ? 0 : left,
      right = typeof right != ‘number‘ ? len - 1 : right;

  if (left < right) {
    partitionIndex = partition(arr, left, right);
    quickSort2(arr, left, partitionIndex-1);
    quickSort2(arr, partitionIndex+1, right);
  }
  return arr;
}

function partition(arr, left ,right) {     //分区操作
  var pivot = left,                      //设定基准值(pivot)
      index = pivot + 1;
  for (var i = index; i <= right; i++) {
    if (arr[i] < arr[pivot]) {
      swap(arr, i, index);
      index++;
    }
  }
  swap(arr, pivot, index - 1);
  return index-1;
}

function swap(arr, i, j) {
  var temp = arr[i];
  arr[i] = arr[j];
  arr[j] = temp;
}

console.log(quickSort2([3,115,91,2,11,6,3,19]));

四、效率分析
快速排序排序效率非常高。虽然它运行最糟糕时将达到O(n²)的时间复杂度,但通常,平均来看,它的时间复杂为O(nlogn),比同样为O(nlogn)时间复杂度的归并排序还要快。快速排序似乎更偏爱乱序的数列,越是乱序的数列,它相比其他排序而言,相对效率更高。
Chrome的v8引擎为了高效排序,在排序数据超过了10条时,便会采用快速排序,对于10条及以下的数据采用的便是插入排序。
同选择排序相似,快速排序每次交换的元素都有可能不是相邻的,因此它有可能打破原来值为相同的元素之间的顺序。因此,快速排序并不稳定。
1、时间复杂度
最坏的情况:时间复杂度为O(n²);
最佳的情况:时间复杂度为O(n);
平均来讲,时间复杂度为O(nlogn)。
2、空间复杂度
空间复杂度为常量O(nlogn)。

时间: 2024-12-20 21:11:11

快速排序之算法的相关文章

快速排序的算法导论划分形式和hoare划分

1. hoare划分 1 int hoare_partition(int a[], int begin, int end) 2 { 3 int pivot = a[begin]; 4 int ini = begin; 5 int ter = end; 6 while (ini < ter) 7 { 8 while (a[ini] <= pivot && ini <end) 9 ++ini; 10 while (a[ter] >= pivot && t

快速排序之算法导论实现

#include <iostream> using namespace std; int partition(int *a,int p,int r) { int x=a[r]; int i=p-1;//note i important which is used for //storage the number smaller than flag x=a[r] for (int j=p;j<r;j++) { if (a[j]<x)// if a[j] smaller than x=

快速排序的算法

自学java到数组时,学习到了两种排序方法:选择排序和冒泡排序,冒泡排序是选择排序的进阶阶段,精简了运算的过程.了解到,java语言已经提供了排序的方法:通过util.Arrays.sort可以对数组进行自动排序,而排序方法用的是快速排序的一种. 快速排序是冒泡排序的进阶阶段,那么快速排序的基本原理又是什么呢.通过查阅资料,了解了算法,自己也尝试了写了一些快速排序的算法原理. 1 package array; 2 //快速排序原理 3 import java.util.Arrays; 4 pub

&lt;算法笔记&gt;关于快速排序的算法优化排序(顺便给百度百科纠个错)

快速排序是排序算法之中的基本中的基本,虽然越来越多的接口函数将快速排序“完美的封装了起来”,比如C++中的qsort或者<algorithm>中的sort(与stable_sort相对应),但是深入思考,关于快速排序的优化你可曾想过?:-P (一)经典快速排序 首先我们来看一下这个百度百科之中的快速排序版本 在上面这张图中,我们一边纠错一边复习下基本的快速排序,基本快速排序的函数体可以明确分为三个块: 1.调整块,根据对称轴pivot(一般选取第一个)从数组的前后两端向中间扫描,pivot作对

冒泡排序和快速排序的算法

实现冒泡排序: [html] view plain copy var times=0; var bubbleSort=function(arr){ for(var i=0;i<arr.length-1;i++){ for(var j=i+1;j<arr.length;j++){ if(arr[i]>arr[j]){//如果前面的数据比后面的大就交换 var temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } console.log("第&quo

快速排序核心算法

这只是核心的算法,当然还存在一些优化的做法,但都是基于以下算法拓展的. 1 package com.meession.javaDataStruct.QuickSort; 2 3 /** 4 * 快排算法思想: 5 * 基于冒泡排序,对其改进,采用递归实现. 数组分区:此趟递归带排序的数组: 6 * 对于每一次的函数调用, 7 * i都被设置为从该数组分区的第0个元素开始,j从该数组分区的最后一个元素开始. 8 * (因为在QuickSort方法中,我们看到的是第一步方法递归之前的代码执行过程,

【C语言】快速排序优质算法的动态显示和字符串的快排

快速排序的动态显示比较简单,不多说,直接上代码: //快速排序动态显示 #include<stdio.h> #include <stdlib.h> #include <Windows.h> void swap(int arry[],int num1, int num2) {              int temp = arry[num1];             arry[num1] = arry[num2];             arry[num2] = t

排序算法----快速排序(链表形式)

单链表形式实现排序算法. 这个快速排序主要利用递归调用.包含4个文件,头文件QuickSort.h,fatal.h,库函数QuickSort.c,测试文件TestQuickSort. QuickSort.h 1 typedef long ElementType; 2 #ifndef _List_H//如果没有编译过 3 #include<stdbool.h> 4 struct Node; 5 typedef struct Node *PtrToNode; 6 typedef PtrToNode

快速排序算法小结

         快速排序是对冒泡排序的一种改进.它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列.          假设要排序的数组是a[6],长度为7,首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序.一躺快速排序的算法是: 1).设