快速排序

1:快速排序的思想

快速排序运用了分治的思想,即通过一趟排序 将序列分为两部分,根据选取的基准, 将比基准小的数放在基准前面,将比基准大的数放在的数放在基准后面;然后对两部分进行递归处理,以达到整个序列有序的状态。

2:快速排序的步骤

(1):选择基准 在一个待排序列中找一个 待排的数作为基准;

(2):分割操作 根据基准将序列分为两部分

(3):将分割后的序列进行递归操作;

3:选择基准的方法

(1):固定基准:即选取序列的第一个数或最后一个数作为基准;(耗费时间长)

(2):三数取中:即将序列中的首 中 尾 三个数 取出来 进行比较取 中间那个数;

4:运算最快的代码组合之一

三数取中 + 插排

#include<stdio.h>void swap(int a, int b){int temp;temp = a;a = b;b = temp;
}//插入排序
void Insertion_sort(int A[], int low, int high){int P,i;                      int N = high - low;for(P = 1; P < N; P++){int temp = A[P];for(i = P; i > 0 && A[i-1] >= temp; i--){A[i] = A[i-1];A[i-1] = temp; }}
}
//选取 一个基准 进行 分成两部分 //使用三数取中法选择枢轴
//int  getstandard(int A[], int i, int j){
//
//  int mid = i + ((j - i) >> 1);//计算数组中间的元素的下标
//
//  //使用三数取中法选择枢轴
//  if (A[mid] > A[j])//目标: arr[mid] <= arr[high]
//  {
//      swap(A[mid],A[j]);
//  }
//  if (A[i] > A[j])//目标: arr[low] <= arr[high]
//  {
//      swap(A[i],A[j]);
//  }
//  if (A[j] > A[i]) //目标: arr[low] >= arr[mid]
//  {
//      swap(A[mid],A[i]);
//  }
//  //此时,arr[mid] <= arr[low] <= arr[high]
//  int key = A[i];
//  //low的位置上保存这三个位置中间的值
//  //分割时可以直接使用low位置的元素作为枢轴,而不用改变分割函数了
//
//  while(i < j){
//
//      while(i < j && A[j] >= key){
//          j--;
//      }
//      if(i < j && A[j] < key){
//          A[i] = A[j];
//      }
//
//      while(i < j && A[i] <= key){
//          i++;
//      }
//      if(i < j && A[i] > key){ //前面的数如果大于key的话 就将前面的数放到后面?
//          A[j] = A[i];
//      }
//  }
//  //出这个循环
//    A[i] = key;
//    return i ;
//}//此为选取第一个 数据作为基准
int  getstandard(int A[], int left, int right){int i = left,j = right;int key = A[left];//选取 第一个数据为基准while(i < j){while(i < j && A[j] >= key){j--;} while(i < j && A[i] <= key){i++;}//当发现 从右边开始发现有比基准数小的时候,从左边开始 遇到比基准数大的时候//交换两个数 if(i < j){swap(A[i],A[j]);}} //出这个循环  交换基准数  和 i 与 j 相等时那个位置的数 A[left] = A[i];A[i] = key;return i;
}void QuickSort(int A[] ,int low ,int high){if(low < high){int standard = getstandard(A, low, high);//递归两部分   QuickSort(A, low, standard-1);QuickSort(A, standard+1, high);              }//当数据小于10的时候选择插入排序明显 比 快排速度更快 if(high - low < 10)Insertion_sort(A, low, high);
}
int main(){int i,n;scanf("%d",&n);int a[n];for(i=0; i<n; i++){scanf("%d",&a[i]);}QuickSort(a,0,n-1);for(i=0; i<n; i++){printf("%d ",a[i]);}
}

数据结构 快速排序(详解)相关推荐

  1. 常用排序:冒泡排序与快速排序详解,看完这篇就够了!风马博客

    常用排序:冒泡排序与快速排序详解. 在排序算法中,冒泡排序和快速排序可以算是排序算法入门必会的两种排序了,今天和大家来分析一下如何快速理解并掌握这两种排序.首先冒泡排序是初学者最常用的排序,所以我们先 ...

  2. java数据结构-链表详解

    文章目录 1.数据结构-链表详解 1.1单链表 1.1.1单链表节点的尾部添加 1.1.2单链表节点的自动排序添加 1.1.3单链表节点的修改 1.1.4单链表节点的删除 1.2单链表面试题 1.2. ...

  3. python 快速排序详解

    python 快速排序详解 快速排序函数 def partition(arr,low,high): i = ( low-1 ) #最小元素<索引>pivot = arr[high] #选取 ...

  4. 数据结构-二叉树-详解

    目录 一.树的概念及结构 1.1树的概念 1.2 树的相关概念​ 1.3树的表示 1.4树在实际中的运用(表示文件系统的目录树结构) 二. 二叉树的概念及结构 2.1概念 2.2特殊二叉树 2.3二叉 ...

  5. 【数据结构】快速排序详解

    目录 一.基本介绍 二.快排的实现 1. 调试环境 2.快排的单趟排序 (1)Hoare版本 (2)挖坑法 (3)前后指针法 2.递归过程 三.快排的优化 1. 优化取key方式,防止栈溢出 2. 小 ...

  6. python 快速排序 详解_数据结构与算法:快速排序(原理讲解+python实现)

    快速排序 快速排序是一种基于分治法(Divide and Conquer)的排序算法 它之所以称为快速排序是因为它的平均时间复杂度为O(nlogn),最坏情况下是O(n2) 但是这样的情况不常见 一般 ...

  7. 【Java】数据结构---二叉树 详解

    快速导航: 1 树形结构 1.1 树形结构 概念 1.2 需要记忆概念 1.3 树的表现形式 2 二叉树 2.1 概念 2.2 两种特殊的二叉树 2.3 二叉树的性质 2.4 相关例题讲解 2.4 二 ...

  8. JavaScript算法与数据结构——字典详解

    字典是一种以键-值对的形式存储数据的数据结构,接下来我们将使用JavaScript实现字典数据结构. 1.定义字典类 由于比较字典数据结构比较简单,就直接上代码好了. class Dictionary ...

  9. 快速排序详解以及java实现

    快速排序作为一种高效的排序算法被广泛应用,SUN的JDK中的Arrays.sort 方法用的就是快排. 快排采用了经典的分治思想(divide and conquer): Divide:选取一个基元X ...

  10. 排序算法之快速排序详解

    一.算法介绍 快速排序:快速排序的基本思想是通过一次排序将等待的记录分成两个独立的部分,其中一部分记录的关键字小于另一部分的关键字.C部分的快速排序一直持续到整个序列被排序. 任取一个元素 (如第一个 ...

最新文章

  1. echarts 环形图 默认高亮展示某个数据
  2. c语言大乐透编译,Excel大乐透摇号vba代码分享,说不定就中百万了呢
  3. 【转】滚动条消息(WM_VSCROLL和WM_HSCROLL)
  4. Android初始化语言 (init.*.rc、init.conf文件格式)
  5. CSS基础——CSS 三大特性【学习笔记】
  6. pyton random 模块
  7. C#程序之快速切换IP地址
  8. 深入理解 JVM 第三版
  9. 简单谈谈对软件工程的理解
  10. matlab 信号去直流,Speex中的近端信号去直流和预加重操作
  11. 递归回溯求解数独 C++实现方法
  12. 财务分析就是财务报表分析吗?
  13. 【2021软件测试扫盲】测试理论(325页“面试教科书”免费送)
  14. 修改cnn梯度下降——MEO方法应用
  15. 北斗导航 | GBAS发展与应用支持CAT II/III类精密进近
  16. STORJ 有实际应用
  17. Android DoraemonKit 教程和简介
  18. c语言埃尔米特插值思路,【数学建模算法】(26)插值和拟合:埃尔米特(Hermite)插值和样条插值...
  19. codeforce_div3_round527_ABCDEF
  20. VS打开后界面找不到win32或者x64的选项怎么办?

热门文章

  1. JS实时监听DOM元素变化 - MutationObserver
  2. Asp.net MVC 中Controller返回值类型ActionResult
  3. C#连接Excel和Access(包括2003和2007版)方法总结
  4. 地理知识归纳:影响降水的九大因素
  5. CityEngine 2012与ArcGIS 10.2破解心得
  6. 动态规划之两个字符串的最大子序列
  7. loadrunner java 参数化_LoadRunner 参数化详解
  8. 语言 分组计算hr_干货 | HR不得不知的面试技巧
  9. 菜鸟学习数据科学家 5 大误区
  10. 女程序员怀孕7个月坚持上班敲代码