排序算法:快速排序

荷兰国旗问题1

给定一个数组和一个数num,把<=num的数放在数组左边,>num的数放在数组右边

void calc(int *arr, int n, int num)
{
	int l = -1;
	int temp;
	for(int i=0;i<n;i++)
	{
		if(arr[i] <= num)
		{
			temp = arr[l+1];
			arr[l+1] = arr[i];
			arr[i] = temp;
			l++;
		}
	}
}

荷兰国旗问题2

给定一个数组和一个数,<num的数放在左边,=num的数放在中间,>num的数放在右边

void calc(int *arr, int n, int num)
{
	int l = -1;
	int r = n + 1;
	int temp;
	int idx = 0;
	while(idx < r)
	{
		if(arr[idx] < num)
		{
			temp = arr[l+1];
			arr[l+1] = arr[idx];
			arr[idx] = temp;
			l++;
            idx++;
		}
		else if(arr[idx] > num)
		{
			temp = arr[r-1];
			arr[r-1] = arr[idx];
			arr[idx] = temp;
			r--;
		}
        else
        {
            idx++;
        }
	}
}

快速排序

时间复杂度:O(N*logN)

空间复杂度:O(logN)

稳定性:不稳定

方法的基本思想是:

1.先从数列中取出一个数作为基准数。

2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

3.再对左右区间重复第二步,直到各区间只有一个数。

void swap(int *arr, int x, int y)
{
	int temp;
	temp = *(arr + x);
	*(arr + x) = *(arr + y);
	*(arr + y) = temp;
	 
}
int* temp(int *arr, int l, int r)
{
	int cmp = arr[r];
	int idx = l;
	int *result = (int *)malloc(sizeof(int)*2);
	memset(result, 0, sizeof(int)*2);
	while(idx <= r)
	{
		if(arr[idx] < cmp)
		{
			swap(arr, l++, idx++)
		}
		else if(arr[idx] > cmp)
		{
			swap(arr, r--, idx);
		}
		else
		{
			idx++;
		}
	}
	*(result + 1) = idx--;
	while(arr[idx] == cmp)
	{
		idx--;
	}
	*result = idx;
	return result;	
}

void qsrot(int *arr, int l, int r)
{
	int *res = NULL;
	if(l >= r)
	{
		return;
	}
	
	res = temp(arr, l, r);
	qsrot(arr, l, *res);
	qsrot(arr, *(res+1), r);
	
	free(res);
}
相关推荐
夜泉_ly4 小时前
算法 -插入排序
c语言·c++·算法·排序算法
shiji-lu4 小时前
考研要求掌握C语言(归并排序)
c语言·开发语言·数据结构·考研·算法·排序算法
lc寒曦4 小时前
【VBA实战】用Excel制作排序算法动画续
排序算法·excel·vba·文档自动化处理
非概念10 小时前
常见的排序算法(二)
数据结构·笔记·算法·排序算法
此生只爱蛋18 小时前
【手撕排序1】希尔排序(直接插入排序)
数据结构·算法·排序算法
running up that hill18 小时前
排序(用java实现)
java·算法·排序算法
安祝老师19 小时前
排序算法基础
数据结构·算法·排序算法
拒绝头秃从我做起19 小时前
基数排序算法
数据结构·算法·排序算法
朱玥玥要每天学习19 小时前
常见插入排序算法的实现(直接插入排序与希尔排序)
java·算法·排序算法
licy__19 小时前
java实现冒泡排序算法
java·算法·排序算法