快速排序 非库函数(转)

设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。一趟快速排序的算法是:1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];3)从j开始向前搜索,即由后开始向前搜索(j -- ),找到第一个小于key的值A[j],A[i]与A[j]交换;4)从i开始向后搜索,即由前开始向后搜索(i ++ ),找到第一个大于key的A[i],A[i]与A[j]交换;5)重复第3、4、5步,直到 I=J; (3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。找到并交换的时候i, j指针位置不变。另外当i=j这过程一定正好是i+或j-完成的最后令循环结束。)

////==================快速排序1==============================void quick_sort( int *a, int low, int high){int i = low, j = high;int temp = a[ low];if( low >= high) return;while( i != j){while( i < j && a[ j] >= temp)j--;a[ i] = a[ j];while( i < j && a[ i] <= temp)i++;a[ j] = a[ i];}a[ i] = temp;quick_sort( a, low, i - 1);  //递归quick_sort( a, i + 1, high);}

==================快速排序2========================================

void qsort(int r[],int t,int m) //t指向第一个元素,m指向最后一个元素
{
int i,j,k;
int x;
if(t>=m) return;
i=t;j=m;x=r[i];
while(i<j)
{
while((i<j)&&(r[i]>=x)) j--;
if(i<j){ r[i]=r[j];i++;}
wwhile((i<j)&&(r[i]<=x)) i++;
if(i<j){r[j]=r[i]; j--;}
}
r[i]=x;
qsort(r,t,j-1);
qsort(r,j+1,m);
}

时间: 2024-12-20 12:59:15

快速排序 非库函数(转)的相关文章

快速排序非递归实现

def quick_sort(arr): ''''' 模拟栈操作实现非递归的快速排序 ''' if len(arr) < 2: return arr stack = [] stack.append(len(arr)-1) stack.append(0) while stack: l = stack.pop() r = stack.pop() index = partition(arr, l, r) if l < index - 1: stack.append(index - 1) stack.

黑马程序员——C语言知识小节------初学者容易忽略的知识点

这两天复习了之前学习的C语言基础知识,发现了许多对于初学者来说重要但是却容易被忽略的问题,在此总结一下,与君共勉. 1.程序中如果用到头文件stdio.h的内容,即使不写#include <stdio.h>程序也可以正常运行,只会警告,不会报错.这是因为链接程序会自动链接库函数.所以如果使用了非库函数的头文件,就必须要写头文件,不然程序就会报错. 2.在使用scanf函数输入参数时,若以空格作为分隔,如: int a, b; scanf("%d %d", &a, &

【数据结构】常见的7种比较排序算法2

● 快速排序(Quick Sort) 1.算法描述: 在平均状况下,排序n个数据要O(nlg(n))次比较.在最坏状况下则需要O(n^2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他O(nlg(n))算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项的可能性. 2.步骤: 1)从数列中挑出一个元素,称为 "基准"(pivot), 2)重新排序数列,所有元素比基准值

排序大荟萃

选择排序 图像化显示: 选择排序的基本思想:从待排序序列中找到最小(大)的元素,存放到序列起始位置,缩小排序范围,再找当前序列最小(大)的元素,放在起始位置之后,直到所有数据都被排完. 时间复杂度=O(n^2) 空间复杂度=O(1) 最好情况:已经有序 交换次数O(1) 最坏情况:逆序 交换次数O(n-1) 下面是c++版本的代码实现 #include <iostream> using namespace std; //初始版本,每次找到最小的 void SelectSort(int *a,s

DirectX中文手册

目  录 第一章 DirectX基础(初级篇) 第一节  什么是DirectX 一.什么是DirectX ? 二.DirectX的组成部分 三.关于DirectDraw 四.为什么要使用DirectDraw? 五.DirectX5.0的新特性? 六.什么是部件对象模型(COM) 七.自我检测 第二节  如何安装和使用DirectX 一.编译库和运行库 二.安装 VC++ 5.0 三.安装 DirectX5.0 的 SDK 四.DirectX 5.0 的文件说明 五.卸载 DirectX 第三节 

内部排序算法比较

一.题目描述 通过随机数据比较各排序算法的关键字比较次数和关键字移动次数,以 及执行时间,取得直观感受. 二.设计要求 一.需求分析 实现各排序算法,分别进行以下各组比较,并进行总结. 一.各算法在不同规模下的比较. 1)比较范围:直接插入排序.冒泡法排序.简单选择排序.快速排序1(自己实现).快速排序2(调用STL).归并排序. 2)比较指标:a)关键字操作次数(比较次数和移动次数之和),b)排序时间.每个指标采用多次重复取平均数记录,重复次数不小于100.注:1次关键字对换按3次移动计算.

C/C++中qsort()以及sort()的用法

最近学弟们问快速排序的比较多,今天自己就做一下总结,快速排序在库函数里面有现成的,不用自己实现,调用一下就可以达到自己想要的结果,掌握以后就可以完全摒弃冒泡和选择了,并且时间复杂度也从O(n*n)提升到O(n*log(n)), 先说C中的qsort(): 头文件:#include<stdlib.h>, 调用参数:qsort(排序首地址,需排序元素个数,需排序元素大小,定义排序方式的函数名): 1,对int型数组a[n]排序: int cmp (const void *a, const void

独角兽蚂蚁花呗5面:Spring+数据库+缓存+红黑树+Docker+微服务等

蚂蚁花呗一面(一个小时):JDK 中有哪几个线程池?顺带把线程池讲了个遍Java容器有哪些?哪些是同步容器,哪些是并发容器?ArrayList和LinkedList的插入和访问的时间复杂度?java反射原理, 注解原理?JDK 中有哪几个线程池?顺带把线程池讲了个遍TCP 和 UDP 的区别?TCP 数据传输过程中怎么做到可靠的?说说一致性 Hash 原理新生代分为几个区?使用什么算法进行垃圾回收?为什么使用这个算法?HashMap push方法的执行过程?HashMap检测到hash冲突后,将

快速排序递归非递归队列堆栈实现

递归实现 #include<iostream> using namespace std; template <class T> void QuickSort(T A[],int left,int right) { if(left<right) { int i=left; int j=right+1; do { do i++;while(A[i]<A[left]); do j--;while(A[j]>A[left]); if(i<j) Swap(A[i],A