首页 > 其他分享 >快速排序的划分及其扩展

快速排序的划分及其扩展

时间:2022-12-13 16:33:19浏览次数:37  
标签:int 扩展 while start 划分 pivot array 排序 left





快速排序之划分及其拓展:

(一)快速排序中的划分:时间复杂度为O(n)

(0)快速排序,冒泡排序都属于是交换排序,因为都需要用到交换两个元素的值。是不稳定的排序。

(1)方法一:
int partition(DataType array[],int left, int right){

DataType pivot=array[left];//选择一个枢纽元,同时在left处挖了一个坑 while(left<right){
while(left<right && array[right]>pivot)//在右边找到比pivot小的元素
right--; array[left]=array[right];//填left处的坑,同时在right处有一个坑
while(left<right && array[left]<pivot)//在左边找到比pivot大的元素
left++; array[right]=array[left];
}
array[left]=pivot;
return left;
}(2)方法二:
int partition(DataType array[], int left ,int right){

int mid=(left+right)/2; DataType pivot=array[mid];
int start=left;
int end=right; while(start<end){
while(start<end && array[end]>=pivot)//寻找出右边小于pivot的元素
end--; while(start<end && array[start]<pivot)//寻找出左边大于等于pivot的元素
start++; if(start<end){
swap(&array[start], & array[end]);//交换array[start]与array[end];
start++;
end--;
} }
swap(&array[mid],&array[start]);
//使array[mid]归位,即array[left,mid-1]都小于array[mid]。
return start;
}(3)递归的快速排序:
void quickSort(DataType array[],int left, int right){
int start=left;
int end=right;
DataType pivot=array[start]; while(start<end){
while(start<end && array[end]>pivot)
end--; array[start]=array[end];
while(start<end && array[start]<pivot)
start++;
array[end]=array[start]; }
array[start]=pivot;
quickSort(array,left,start-1);
quickSort(array,start+1,right);
}

(4)非递归的快速排序:

1)思想:

仿造二叉树的先序遍历的非递归实现;

1.建立一个栈,栈中的每个元素为一个结构体,包含low,high两个字段,low,high分别为某个子数组的首尾下标;
2.先将(0,n-1)进栈,在栈不空时循环:出栈一个子序列array[low,high],然后将array[low]作为枢纽元,对array[low,high]进行划分,分为两个子序列array[low,i-1]和array[i+1,high]。然后将[lwo,i-1]和[i+1,high]进栈

2)代码实现:
void quickSort(DataType array[], int length){

struct Elem{ //定义栈中的每个元素
int low;
int high;
} ; Elem stack[Maxsize];
int top=-1; int start,end ;
int startTemp,endTemp; DataType pivot;
top++;//0号元素进栈
stack[top].low=0; stack[top].high=length-1;
while(top>-1){
start=stack[top].low;//出栈
end=stack[top].high;
top--; startTemp=start;
endTemp=end; if(start<end){
pivot=array[start]; while(startTemp<endTemp && array[endTemp]>pivot)
endTemp--;
array[startTemp]=array[endTemp]; while(startTemp<endTemp && array[startTemp]<pivot)
startTemp++; array[endTemp]=array[startTemp];
} array[startTemp]=pivot;
top++;//将左半区间[start,startTemp-1]进栈
stack[top].low=start; stack[top].high=startTemp-1;
top++;//将右半区间[startTemp+1,end]进栈
stack[top].low=startTemp+1; stack[top].high=end;
}
}----------

(二)给定一个字符串,有大小写字母,写一个函数将小写字母放到前面,大写字母放到后面。

(1)思想:
根据快速排序中的划分思想;比pivot小的元素都在pivot左边,比pivot大的元素都在pivot右边。

(2)代码实现:

void partitionTemp(char *a ){

char * pstart=a;//a的第一个元素的位置
char * pend=a+strlen(a)-1;//a的最后一个元素的位置 while(pstart<pend){
//从左往右查找,找第一个大写字母
while( *pstart && (*pstart<'z' && *pstart>'a' ) )
pstart++; if(*pstart=='\0') break;
//从右往左,找出第一个小写字母
while(*pend<'Z' && *pend>'A')
pend--; if(i<j){
swap(pstart,pend);//交换*pstart,*pend
} pstart++;
pend--;
}
}

3)注意:
1.此中为双向扫描,比单向扫描快。
2.只可以保证小写字母在大写字母,不可以保证移动前后小写字母的顺序不变。
----------

(三)给定一个字符串,有字母,有数字,要求将数字放到字母前面,且数字,字母的先后顺序不变。

1)举例:
如原始字符串为"a12bcde3"则变为"123abcde".

2)思想:
1.建立两个队列,分为存储字母和数字。
2.扫描一遍字符串,字母添加到字母队列,数字添加到数字队列,
3.然后将数字队列和字母队列分别出队。

 

标签:int,扩展,while,start,划分,pivot,array,排序,left
From: https://blog.51cto.com/u_15911260/5934640

相关文章

  • 直接插入排序 && 折半插入排序 && 希尔排序
    插入排序&&折半插入排序&&希尔排序:(一)插入排序:(1)代码实现:voidinsertSort(int*array,intn){inttemp;inti,j;for(i=1;i<n;i++){if(array[i]<array[i-1])......
  • C++ 不知算法系列之聊聊希尔、归并排序算法中的分治哲学
    1.前言排序算法中,冒泡、插入、选择属于相类似的排序算法,这类算法的共同点:通过不停地比较,再使用交换逻辑重新确定数据的位置。希尔、归并、快速排序算法也可归为同一类,它......
  • 冒泡排序
    冒泡排序QList<int>Qt_2022121201::sortList(QList<int>list_param){for(intk=0;k<list_param.size()-1;k++){for(intj=0;j<list......
  • sys_stat_statements 扩展使用介绍
    sys_stat_statements模块提供追踪服务器所执行的所有SQL语句的执行统计信息,可以用于统计数据库的资源开销,如分析TOPSQL。KingbaseESV8R6版本该插件已经内置化,初始化数......
  • 希尔排序的实现
    排序是非常常见且常用的算法,这次的排序算法是希尔排序见例题如下:本题要求实现一趟希尔排序函数,待排序列的长度1<=n<=1000。函数接口定义:voidShellInsert(SqListL,in......
  • MVC为Html对象建立一个扩展方法,使用自己的控件就像使用TextBox一样方便
    先看一下我想要的结果:​​​​很容易它就是一个单选按钮组,当我后台为Html对象(HtmlHelper的一个实例,它被定义在System.Web.Mvc名称空间下的WebViewPage类,即它对于所有MVC......
  • 【LeetCode】二分法--剑指 Offer 53 - I. 在排序数组中查找数字 I
    点击直达题目内容统计一个数字在排序数组中出现的次数。示例示例1:输入:nums=[5,7,7,8,8,10],target=8输出:2示例2:输入:nums=[5,7,7,8,8,10],target......
  • 直接插入排序
    排序是非常常见且常用的算法,这次的排序算法是直接插入排序见例题如下:本题要求实现直接插入排序函数,待排序列的长度1<=n<=1000。函数接口定义:voidInsertSort(SqListL......
  • 一文了解openEuler SIG组角色划分与管理运作
    SIG,即SpecialInterestGroup(特别兴趣小组)。它是openEuler社区的开发者们为了更好地管理和发展社区技术生态,根据多样性计算、云原生全栈、全场景协同、大数据与AI、兼容性......
  • 洛谷 P1113 杂务(拓扑排序,递归)
    题目大意:有一个有向无圈图,每个节点看作一个任务,一个任务需要完成必须先完成父亲节点的任务,每个任务都有耗时。假设现在所有不相关任务都可以并行执行,问最短多少时间可以把所......