文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

web如何实现快速排序

2023-06-27 15:12

关注

这篇文章主要为大家展示了“web如何实现快速排序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“web如何实现快速排序”这篇文章吧。

快速排序是对冒泡排序的一种改进。它的基本思想是:通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归或者非递归进行,以此达到整个数据变成有序序列。

1. 算法步骤

  1. 从数列中挑出一个元素,称为 “基准”(pivot);
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

2. 动图演示

web如何实现快速排序

代码实现

JavaScript

实例

function quickSort(arr, left, right) {   var len = arr.length,       partitionIndex,       left = typeof left != 'number' ? 0 : left,       right = typeof right != 'number' ? len - 1 : right;   if (left return arr;}function partition(arr, left ,right) {     // 分区操作   var pivot = left,                      // 设定基准值(pivot)       index = pivot + 1;   for (var i = index; i if (arr[i] return index-1;}function swap(arr, i, j) {   var temp = arr[i];   arr[i] = arr[j];   arr[j] = temp;}function partition2(arr, low, high) { let pivot = arr[low]; while (low while (low  pivot) {     --high;   }   arr[low] = arr[high];   while (low return low;}function quickSort2(arr, low, high) { if (low let pivot = partition2(arr, low, high);   quickSort2(arr, low, pivot - 1);   quickSort2(arr, pivot + 1, high); } return arr;}
Python

实例

def quickSort(arr, left=None, right=None):   left = 0 if not isinstance(left,(int, float)) else left   right = len(arr)-1 if not isinstance(right,(int, float)) else right   if left return arrdef partition(arr, left, right):   pivot = left   index = pivot+1   i = index   while  i if arr[i] return index-1def swap(arr, i, j):   arr[i], arr[j] = arr[j], arr[i]
Go

实例

func quickSort(arr []int) []int {       return _quickSort(arr, 0, len(arr)-1)}func _quickSort(arr []int, left, right int) []int {       if left return arr}func partition(arr []int, left, right int) int {       pivot := left       index := pivot + 1       for i := index; i if arr[i] return index - 1}func swap(arr []int, i, j int) {       arr[i], arr[j] = arr[j], arr[i]}
C++

实例

//严蔚敏《数据结构》标准分割函数Paritition1(int A[], int low, int high) {  int pivot = A[low];  while (low while (low = pivot) {      --high;    }    A[low] = A[high];    while (low return low;}void QuickSort(int A[], int low, int high) //快排母函数{  if (low
Java

实例

public class QuickSort implements IArraySort {   @Override   public int[] sort(int[] sourceArray) throws Exception {       // 对 arr 进行拷贝,不改变参数内容       int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);       return quickSort(arr, 0, arr.length - 1);   }   private int[] quickSort(int[] arr, int left, int right) {       if (left return arr;   }   private int partition(int[] arr, int left, int right) {       // 设定基准值(pivot)       int pivot = left;       int index = pivot + 1;       for (int i = index; i if (arr[i] return index - 1;   }   private void swap(int[] arr, int i, int j) {       int temp = arr[i];       arr[i] = arr[j];       arr[j] = temp;   }}
PHP

实例

function quickSort($arr){   if (count($arr) return $arr;   $middle = $arr[0];   $leftArray = array();   $rightArray = array();   for ($i = 1; $i $arr); $i++) {       if ($arr[$i] > $middle)           $rightArray[] = $arr[$i];       else           $leftArray[] = $arr[$i];   }   $leftArray = quickSort($leftArray);   $leftArray[] = $middle;   $rightArray = quickSort($rightArray);   return array_merge($leftArray, $rightArray);}
C

实例

typedef struct _Range {   int start, end;} Range;Range new_Range(int s, int e) {   Range r;   r.start = s;   r.end = e;   return r;}void swap(int *x, int *y) {   int t = *x;   *x = *y;   *y = t;}void quick_sort(int arr[], const int len) {   if (len return; // 避免len等於負值時引發段錯誤(Segment Fault)   // r[]模擬列表,p為數量,r[p++]為push,r[--p]為pop且取得元素   Range r[len];   int p = 0;   r[p++] = new_Range(0, len - 1);   while (p) {       Range range = r[--p];       if (range.start >= range.end)           continue;       int mid = arr[(range.start + range.end) / 2]; // 選取中間點為基準點       int left = range.start, right = range.end;       do {           while (arr[left] while (arr[right] > mid) --right; //檢測基準點右側是否符合要求           if (left while (left if (range.start if (range.end > left) r[p++] = new_Range(left, range.end);   }}
递归法

实例

void swap(int *x, int *y) {   int t = *x;   *x = *y;   *y = t;}void quick_sort_recursive(int arr[], int start, int end) {   if (start >= end)       return;   int mid = arr[end];   int left = start, right = end - 1;   while (left while (arr[left] while (arr[right] >= mid && left if (arr[left] >= arr[end])       swap(&arr[left], &arr[end]);   else       left++;   if (left)       quick_sort_recursive(arr, start, left - 1);   quick_sort_recursive(arr, left + 1, end);}void quick_sort(int arr[], int len) {   quick_sort_recursive(arr, 0, len - 1);}
C++

函数法

sort(a,a + n);// 排序a[0]-a[n-1]的所有数.

迭代法

实例

// 参考:http://www.dutor.net/index.php/2011/04/recursive-iterative-quick-sort/struct Range {   int start, end;   Range(int s = 0, int e = 0) {       start = s, end = e;   }};template  // 整數或浮點數皆可使用,若要使用物件(class)時必須設定"小於"("大於"(>)、"不小於"(>=)的運算子功能void quick_sort(T arr[], const int len) {   if (len return; // 避免len等於負值時宣告堆疊陣列當機   // r[]模擬堆疊,p為數量,r[p++]為push,r[--p]為pop且取得元素   Range r[len];   int p = 0;   r[p++] = Range(0, len - 1);   while (p) {       Range range = r[--p];       if (range.start >= range.end)           continue;       T mid = arr[range.end];       int left = range.start, right = range.end - 1;       while (left while (arr[left] while (arr[right] >= mid && left if (arr[left] >= arr[range.end])           std::swap(arr[left], arr[range.end]);       else           left++;       r[p++] = Range(range.start, left - 1);       r[p++] = Range(left + 1, range.end);   }}
递归法

实例

templatevoid quick_sort_recursive(T arr[], int start, int end) {   if (start >= end)       return;   T mid = arr[end];   int left = start, right = end - 1;   while (left while (arr[left] while (arr[right] >= mid && left if (arr[left] >= arr[end])       std::swap(arr[left], arr[end]);   else       left++;   quick_sort_recursive(arr, start, left - 1);   quick_sort_recursive(arr, left + 1, end);}template  //整數或浮點數皆可使用,若要使用物件(class)時必須設定"小於"("大於"(>)、"不小於"(>=)的運算子功能void quick_sort(T arr[], int len) {   quick_sort_recursive(arr, 0, len - 1);}

以上是“web如何实现快速排序”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯