快速排序的递归、非递归实现

快速排序的基本思想

快速排序是冒泡排序的一种改进,其基本思想是通过一趟排序将数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据小,然后按此方法分别对这两部分数据进行快速排序,依次进行从而达到使整个数据变得有序。

快速排序的实现原理

图片引用自哔哩哔哩UP@秒懂算法视频截图
如上图示:首先,设置好基准轴Pivot,设置待排序区间的左右边界记为L、R,将L从左向右遍历,遇到比Pivot大的就放在轴的右边,将R从右向左遍历,遇到比Pivot小的,就放在轴的左边。直到L和R位置重合,一旦重合,就将Pivot放到该位置,那就完成了一次排序

递归实现(C++)

#include<iostream> 
#include<stdlib.h>
using namespace std;
//完成一次快速排序,返回的下标为分割点,接下来要将分割点
//左右边两部分进行快速排序 
int quickSortOneTime(int arr[], int low, int high){
	int basic = arr[low];
	while(low < high){
		while(low < high && arr[high] >= basic) {
			high--;
		}
		if(low < high) arr[low] = arr[high];
		while(low < high && arr[low] <= basic){
			low++;
		}
		if(low < high) arr[high] = arr[low];
	}
	arr[low] = basic;
	return low;
}
//递归实现快速排序 
void quickSort1(int arr[], int low, int high) {
	if(low < high){
		int mid = quickSortOneTime(arr, low, high);
		quickSort1(arr, low, mid-1);
		quickSort1(arr, mid+1, high);
	}
}
void print(int arr[]){
	int num = 7;
	for(int i = 0; i < num; i++){
		cout << arr[i] << "*";
	}
}
int main(){
	int arr1[7] = {7,6,5,4,3,2,1};
	quickSort1(arr1, 0, 6);
	print(arr1);
	return 0;
}

非递归实现(C++)

使用堆栈,堆栈使用单向链表实现

#include<iostream> 
#include<stdlib.h>
using namespace std;
//使用单链表创造堆栈,结点要指向开头,易删除和插入 
typedef struct SNode *stack;
struct SNode{
	int data;
	stack top; 
}; 
//完成一次快速排序,返回的下标为分割点,接下来要将分割点
//左右边两部分进行快速排序 
int quickSortOneTime(int arr[], int low, int high){
	int basic = arr[low];
	while(low < high){
		while(low < high && arr[high] >= basic) {
			high--;
		}
		if(low < high) arr[low] = arr[high];
		while(low < high && arr[low] <= basic){
			low++;
		}
		if(low < high) arr[high] = arr[low];
	}
	arr[low] = basic;
	return low;
}
//创建堆栈,创建一个头结点,不存放数据,指针指向NULL 
stack makeStack(){
	stack s;
	s = (stack)malloc(sizeof(struct SNode));
	s->top = NULL;
	return s;
}
//入栈 
void push(stack s, int x){
	stack p;
	p = (stack)malloc(sizeof(struct SNode));
	p->data = x;
	p->top = s->top;
	s->top = p;
}
//判断堆栈是否为空,返回值为布尔类型 
bool isEmpty(stack s){
	if(!s->top) return true;
	else return false;
}

//出栈
int pop(stack s){
	if(isEmpty(s)){
		return -1;
	}else{
		stack p = s->top;
		int mid = p->data;
		s->top = p->top;
		free(p);//释放空间 
		return mid;
	}
} 
//非递归实现快速排序,使用压栈
void quickSort2(int arr[], stack s, int low, int high){
	if(low < high){
		//此时堆栈为空,进行第一次快速排序 
		int mid = quickSortOneTime(arr, low, high);
		if(low < mid-1){
			push(s, low);
			push(s, mid-1);
		}
		if(mid+1 < high){
			push(s, mid+1);
			push(s, high);
		}
		//只要堆栈不空,就代表还有子区间内待排序,因此循环 
		while(!isEmpty(s)){
			int high = pop(s);
			int low = pop(s);
			//出栈获得区间下标,进行排序 
			mid = quickSortOneTime(arr, low, high);
			//如果子区间依旧需要排序则依次入栈 
			if(low < mid-1){
				push(s, low);
				push(s, mid-1);
			}
			if(mid+1 < high){
				push(s, mid+1);
				push(s, high);
			}
		}
	}
} 

void print(int arr[]){
	int num = 7;
	for(int i = 0; i < num; i++){
		cout << arr[i] << "*";
	}
}
int main(){
	int arr2[7] = {17,16,15,14,13,12,11};
	stack s = makeStack();
	quickSort2(arr2, s, 0, 6);
	print(arr2);
	return 0;
}

参考
[1]: https://www.cnblogs.com/zhangchaoyang/articles/2234815.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值