快速排序
快速排序:
设要排序的数组是A[0]……A[N-1],
思想:分治法(递归实现)关键是求出基准记录所在的位置(由于两个数之间进行交换,导致原来基准的位置发生改变)
1.分解 任意选取一个数据(通常选用数组的第一个数)作为关键数据,被称为privot
2.求解 将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。通过递归算法调用,对左、右子区间进行快速排序。
3.组合 无需做什么,可以看做是空操作。(左右区间已经为有序的序列)
时间复杂度:平均复杂度O(n*lgn);最差复杂度O(N*N)
具体描述:
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
主要的时间花费在“划分”
Partition algorithm is important per se, therefore it may be carried out as a separate function. 划分算法比每一部分都重要,so被写成一个独立的函数。 函数为:partition(用途:确定基准的位置,交换后的相应的位置)
1 int partition(int arr[],int low,int high){
2
3 int i=low,j=high;
4 int tmp;
5 int privot=arr[(low+high)/2];//make the middle of the array the privot
6
7 while(i<=j){
8 while(arr[i]<privot){
9 i++;
10 //++i;
11 }
12 while(arr[j]>privot){
13 j--;
14 //--j;
15 }
16 if(i<=j){
17 tmp=arr[i];
18 arr[i]=arr[j];
19 arr[j]=tmp;
20 i++;//continue the next turn;
21 j--;
22 }
23 }
24 return i;
25 }
26 void quicksort(int arr[],int low,int high){
27 int index=partition(arr,low,high);
28 /* recursion */
29 if(low<index-1){
30 quicksort(arr,low,index-1);
31 }
32 if(index<high){
33 quicksort(arr,index,high);
34 }
35 }
显示结果:
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- AngularJS 中的 factory、 service 和 provider
- 设计模式之适配器模式
- 设计模式之组合模式
- MvvmCross 框架中的数据绑定语法
- Vivado IP核锁定的解除方法
- Flutter Dojo设计之道——骚气的闪屏动画是如何实现的
- 数据处理 | pandas入门专题——离散化与one-hot
- 聊聊dubbo-go的failfastCluster
- 一分钟学Python|Python的循环语句
- OpenCV4.4 中SIFT特征匹配调用演示
- 这些Python库虽然冷门,但功能真的很强大!
- SQL查找是否"存在",别再count了,很耗费时间的
- 采用 Vue 编写的功能强大的 Swagger-ui 页面
- SQL 计算中位数
- SQL 打印成绩单