快速排序

7 篇文章 0 订阅
6 篇文章 0 订阅
#if 0
### 快速排序原理
- 利用双指针将小数放在左边,大数放在右边
### 编程思路
- 选定左右指针(left、right)和基数(basic),基数随机设为left对应的值
- right探测小于basic,停下来准备和left交换(找大数)
- left探测大于basic,停下来和right交换(找小数)
- right继续探测直到小于basic,直到遇到left
- left继续探测直到大于basic,直到遇到right
- 若两则相遇,则将相遇的数(i或j)与基数(basic)交换,到此时完成一次循环。

> -将离散数列分成两部分左边小于基数,右边大于基数
> -递归左右两边继续快排

```c
#endif

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

void swap(int* a, int* b);
int Partion(int arr[], int left_bound, int right_bound);
void QuickSort(int arr[], int left_bound, int right_bound);
void ra(void);

int arr[] = {4,6,9,6,0,3,11,90,-3,7,3,2,1,6,5};
int len = sizeof(arr) / sizeof(arr[0]);

int main() {
	printf("before:"); for (int i = 0; i < len; i++) printf("%d ", arr[i]); printf("\n");
	//Partion(arr, 0, len - 1);
	QuickSort(arr, 0, len -1);
	printf("after :"); for (int i = 0; i < len; i++) printf("%d ", arr[i]); printf("\n");
	system("pause");
	return 0;
}

#if 1
int Partion(int arr[], int left_bound, int right_bound) {//实现“治”
	int left = left_bound;
	int right = right_bound;
	int pivot = arr[left_bound];
	if (left_bound > right_bound)
		return -1;
	while (left < right)
	{
		while (arr[right] >= pivot && left < right)	//找大数
			right--;
		while (arr[left] <= pivot && left < right)	//找小数
			left++;
		if (left < right)							//不能越界交换
			swap(&arr[left], &arr[right]);
	}
	swap(&arr[left_bound], &arr[left]);		//相遇换轴
	return left;
}
/* 快排思想:设轴,左边小于轴的和右边大于轴的交换
 * Time:O(NlogN) 
 * Space: O(logN)
 * 递归的层数,每层存取的临时变量
 */
void QuickSort(int arr[], int left_bound, int right_bound)
{
	if (left_bound > right_bound) return;
	int pivot_ptr = Partion(arr, left_bound, right_bound);
	QuickSort(arr, left_bound, pivot_ptr - 1);
	QuickSort(arr, pivot_ptr + 1, right_bound);
}

#endif

void swap(int* a, int* b)
{
	int tmp = 0;
	tmp = *a;
	*a = *b;
	*b = tmp;
}

#if 0

int Partion(int arr[], int left_bound, int right_bound) {//实现“治”
	printf("before_arr: "); for (int i = left_bound; i < right_bound + 1; i++) printf("%d ", arr[i]); printf("\n");
	int left = left_bound;
	int right = right_bound - 1;
	int pivot = arr[right_bound];
	printf("left_bound = %d\tright_bound = %d\tpivot = %d\n", left_bound, right_bound, pivot);
	while (left <= right)
	{
		while (arr[right] >= pivot && left <= right)	//找大数
			right--;
		while (arr[left] < pivot && left <= right)	//找小于或等于的数
			left++;
		printf("in the while--");  printf("left = %d\tright = %d\n", left, right);
		if (left < right)							//不能越界交换
			swap(&arr[left], &arr[right]);
		printf("in the while--");  for (int i = left_bound; i < right_bound + 1; i++) printf("%d ", arr[i]); printf("\n");
	}

	swap(&arr[right_bound], &arr[left]);		//相遇换轴
	printf("aftre_arr: "); for (int i = left_bound; i < right_bound + 1; i++) printf("%d ", arr[i]); printf("\n");
	return left;
}
/* 快排思想:设轴,左边小于轴的和右边大于轴的交换
 * Time:O(NlogN)
 * Space: O(logN)
 * 递归的层数,每层存取的临时变量
 */
void QuickSort(int arr[], int left_bound, int right_bound)
{
	if (left_bound > right_bound) return;
	int pivot_ptr = Partion(arr, left_bound, right_bound);
	QuickSort(arr, left_bound, pivot_ptr - 1);
	QuickSort(arr, pivot_ptr + 1, right_bound);
}

#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
神速百度SEO排名优化器主要为广大站长提供网站排名优化功能。可以按百度和(google)的规则快速提升指定关键词的排名。 神速百度SEO排名优化软件特点: 1、最容易收录的是.html的静态页面; 2、网页内容中关键词的密度和突出性(包括Title、DeScription和Keyword,还有正文中关键词的密度); 3、网站结构(目录的结构); 4、更新频率; 5、内容的价值(主要看是否是原创); 6、外链的价值; 神速百度SEO排名优化软件功能: 1、您可以指定几个您网站内容相关的关键词,软件可以自动通过这些关键词搜索到与您网站内容相符的文章。并下载。 2、用这些文章自动生成网页,并按随机而合理的密度插入您指定的关键词,自动配置好网页中的Title、DeScription和Keyword,插入关键词的网页和原文件已经不同,所以,内容接近原创,更容易得到百度的信任。并按指定的间隔上传生成的网页,建议每10小时上传一次。 3、定时更新上传优化的网页,增强网站的活跃性,使百度收录您网站内容的频率更快,网站排名迅速上升。 4、自动生成网站地图,也就是您所知道的sitemap.xml文件,但我们的软件会给它自动随机生成一个文件名,这样,就不容易被百度抓到规律K站了。上传网页自动更新网站地图文件。在百度站长平台提交网站地图文件后,百度会自动更新您的网页列表。 5、自动生成优化网页的列表,使优化网页的内链更合理。 6、自动交换友情链接,自动形成友情链接的联盟。您的网址将会被成千上万个网站做反向链接。网站权重迅速上升。 用以上的方法,可以迅速提升您的网站排名,根据难度不同,理论上,排到第一页只是时间问题。 注意:生成的优化网页与您制作的网页是分开的,不会影响您正常网页的内容,优化的目的是提升网站在搜索引擎中的权重,权重高了,您的正常内容自然就会排到前面。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值