Quicksort

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define BUFSIZE 19

void swap(int *arr, int i, int j)
{
	int tmp = arr[i];
	arr[i] = arr[j];
	arr[j] = tmp;
}

int Random(int left, int right)
{
	time_t t;
	srand((unsigned int)time(&t));
	return left + rand() % (right-left+1);
}

int Partition(int *arr, int left, int right)
{
	int pivot = arr[right];
	int j = left;
	for (int i = left; i < right; i++) {
		if (arr[i] <= pivot)
			swap(arr, j++, i);
	}
	swap(arr, j, right);

	return j;
}

int PartitionA(int *arr, int left, int right)
{
	int pivot = arr[right];
	int j = left - 1;
	for (int i = left; i < right; i++) {
		if (arr[i] <= pivot)
			swap(arr, ++j, i);
	}
	swap(arr, j + 1, right);

	return j + 1;
}

int PartitionB(int *arr, int left, int right)
{
	// 选中间元素作为枢纽
	swap(arr, left, (left + right) / 2); 
	int pivot = arr[left];

	int j = left;
	for (int i = left + 1; i <= right; i++) {
		if (arr[i] <= pivot)
			swap(arr, ++j, i);
	}
	swap(arr, j, left);

	return j;
}

int PartitionC(int *arr, int left, int right)
{
	int last = Random(left, right); // 随机化快排
	swap(arr, right, last);
	int pivot = arr[right];

	int j = left - 1;
	for (int i = left; i < right; i++) {
		if (arr[i] <= pivot)
			swap(arr, ++j, i);
	}
	swap(arr, j + 1, right);

	return j + 1;
}

int Partition1(int *arr, int left, int right)
{
	int pivot = arr[left];

	while (left < right) { // [) ro (]
		// 从右边开始
		while (left < right && arr[right] >= pivot) 
			right--;
		arr[left] = arr[right];
		while (left < right && arr[left] <= pivot)
			left++;
		arr[right] = arr[left];
	}
	arr[left] = pivot;

	return right;
}

int Partition2(int *arr, int left, int right)
{
	int pivot = arr[right];

	while (left < right) {
		// 从左边开始
		while (left < right && arr[left] <= pivot) 
			left++;
		arr[right] = arr[left];
		while (left < right && arr[right] >= pivot)
			right--;
		arr[left] = arr[right];
	}
	arr[right] = pivot;

	return left;
}

int Partition3(int *arr, int left, int right)
{

	int pivot = arr[right];
	int end = right;

	while (left < right) { 
		while (left < right && arr[left] <= pivot) 
			left++;
		while (left < right && arr[right] >= pivot)
			right--;	
		if (left < right)
			swap(arr, left, right);
	}

	if (right != end)
		swap(arr, right, end);

	return left; // 谁先操作返回谁
}

int Partition4(int *arr, int left, int right)
{
	int pivot = arr[left];

	int i = left - 1;
	int j = right + 1;
	while (1) {
		while (arr[--j] > pivot)
			;
		while (arr[++i] <= pivot)
			;
		if (i < j)
			swap(arr, i, j);
		else 
			break;
	}
	swap(arr, left, j);

	return j;
}

// 如何证明它有bug? ^-^
int Partition5(int *arr, int left, int right)
{
	int pivot = arr[left];

	int i = left - 1;
	int j = right + 1;
	while (i < j) {
		while (i < j && arr[--j] > pivot)
			;
		while (i < j && arr[++i] < pivot)
			;
// 		do {
// 			j--;
// 		} while (arr[j] > pivot);
// 		do {
// 			i++;
// 		} while (arr[i] < pivot);

		if (i < j)
			swap(arr, i, j);
		else
			return j;
	}
}

void QuickSort(int *arr, int left, int right)
{
	if (left >= right)
		return ;

	int pivot = PartitionC(arr, left, right);
	QuickSort(arr, left, pivot - 1);
	QuickSort(arr, pivot + 1, right);
}

void StoogeSort(int *arr, int left, int right)
{
	if (arr[left] > arr[right])
		swap(arr, left, right);
	if (left + 1 >= right)
		return ;

	int k = (right - left + 1) / 3;
	StoogeSort(arr, left, right - k);
	StoogeSort(arr, left + k, right);
	StoogeSort(arr, left, right - k);
}

#define MAX_BUF 256

int numcmp(char *pa, char *pb)
{
	return (*(int *)pa - *(int *)pb);
}

void *mybsearch(const void *key, const void *base,
	size_t n, size_t size,
	int (*cmp)(const void *, const void *))
{
	const char *p;
	size_t m;

	for (p = (const char *)base, m = n; m > 0; ) {
		const size_t pivot = n >> 1;
		const char *const q = p + size * pivot;
		const int val = (*cmp)(key, q);

		if (val < 0) { /* search below pivot */ 
			n = pivot;
		} else if (val == 0) {
			return ((void *)q);
		} else { /* search above pivot */ 
			p = q + size;
			n -= pivot + 1;
		}
	}

	return NULL;
}


// 如part3框架一样
void myqsort(void *base, size_t n, size_t size, 
	int (*cmp)(const void *, const void *))
{
	while (1 < n) {
		size_t i = 0;
		size_t j = n - 1;
		char *qi = (char *)base;
		char *qj = qi + size * j; // 指向最后一个元素
		char *qp = qj; // 选择最后一个点作为pivot

		while (i < j) {
			while (i < j && (*numcmp)(qi, qp) <= 0)
				++i, qi += size;
			while (i < j && (*numcmp)(qp, qj) <= 0)
				--j, qj -= size;
			if (i < j) {  /* swap elements i and j */
				char buf[MAX_BUF];
				char *q1 = qi;
				char *q2 = qj;
				size_t m, ma;
				
				for (ma = size; 0 < ma; ma -= m, q1 += m, q2 -= m) {
					m = ma < sizeof(buf) ? ma : sizeof(buf);
					memcpy(buf, q1, m);
					memcpy(q1, q2, m);
					memcpy(q2, buf, m);
				}
				++i, qi += size;
			}
		}

		/* swap elements i and pivot */
		if (qi != qp) { 
			char buf[MAX_BUF];
			char *q1 = qi;
			char *q2 = qp;
			size_t m, ma;

			for (ma = size; 0 < ma; ma -= m, q1 += m, q2 -= m) {
				m = ma < sizeof(buf) ? ma : sizeof(buf);
				memcpy(buf, q1, m);
				memcpy(q1, q2, m);
				memcpy(q2, buf, m);
			}
		}
		j = n - i - 1;
		qi += size;

		if (j < i) { /* recurse on smaller partition */
			if (1 < j)
				qsort(qi, j, size, cmp);
			n = i;
		} else { /* lower partition is smaller */
			if (1 < i)
				qsort(base, i, size, cmp);
			base = qi;
			n = j;
		}

	}
}


int main()
{
	int arr[] = {17, 5, 9, 21, 6, 123, 24, 8, 34, 324, 3, 23, 54, 22, 57, 234, 7, 12, 234};
	/*int arr[8] = {234, 123, 76, 76, 54, 43, 32, 21};*/               
	/*int arr[8] = {1, 45, 43, 45, 65, 45, 87, 353};*/
	int len = sizeof(arr) / sizeof(arr[0]);
	printf("array:");
	for (int i = 0; i < len; i++) {
		printf("%-8d", arr[i]);
	}
	printf("\n");
	QuickSort(arr, 0, len - 1);
	//StoogeSort(arr, 0, BUFSIZE - 1);
	//myqsort(arr, BUFSIZE, sizeof(int), (int (*)(const void *, const void *))numcmp);

	printf("quick:");
	for (int i = 0; i < len; i++) {
		printf("%d\t", arr[i]);
	}
	printf("\n");

	getchar();
	return 0;
}                                                                                            

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值