快速排序-----分治思想

本文详细介绍了分治思想及其在快速排序算法中的应用。首先,通过百度百科解释了分治思想的条件和设计步骤。接着,讨论了Acwing平台上的两种快速排序方法,包括如何确定分界点、调整区间以及递归处理。文中提到了使用双指针技巧来优化调整区间的操作。最后,提供了两段C++代码实现快速排序,强调了在处理大量数据时,scanf的输入效率高于cin,并提醒注意内存溢出可能导致程序异常退出。
摘要由CSDN通过智能技术生成

目录

一、百度

 二、Acwing ----Y神 

三、代码和模板

一、百度

1、百度百科----分治思想

https://baike.baidu.com/item/%E5%88%86%E6%B2%BB/3029637?fr=ala

分治思想的条件和设计步骤

2、快速排序

快排是在冒泡排序之上改进的

3、动态图

 二、Acwing ----Y神 

方法一

1、确定分界点

其中x=q【(l+r)/2】。

2、调整区间

 其中让小于x的排到左边,让大于x的排到右边。注意y点不是正中间的点。

3、递归处理两边

注意:最重要的不足就是处理第二步:调整区间。

(1)先开辟两个数组

(2)q【l---r】区间 ,把小于等于x的放进a【】中,把大于x的放进b【】中。

(3)再把a,b放进q【】中。

方法二

双指针调整区间。让指针分别从最左边和最右边开始遍历,如果指针分别大于x,小于x,交换两指针,如此方法,直到指针相遇。

其余步骤依然按照方法一。

!!!注意。这种问题都是有边际的,请注意!

三、代码和模板

Acwing 785 

#include<iostream>
using namespace std;
const int N=1000010;
int n;
int a[N];
void quick_sort(int a[],int l,int r)
{
    if(l>=r) return;
    int i=l-1,j=r+1,x=a[(l+r)/2];
    while(i<j)
    {
        do i++; while(a[i]<x);
        do j--; while(a[j]>x);
        if(i<j) swap(a[i],a[j]);
    }
    quick_sort(a,l,j);
    quick_sort(a,j+1,r);
}
int main()
{
    int i;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    quick_sort(a,0,n-1);
    for(i=0;i<n;i++)
    {
        printf("%d ",a[i]);
    }
    return 0;
}

洛谷【深基9.例4】求第 k 小的数 - 洛谷

#include<bits/stdc++.h>
using namespace std;
int x[5000005],k;
void qsort(int l,int r)
{
	int i=l,j=r,mid=x[(l+r)/2];
	do
	{
		while(x[j]>mid)
			j--;
		while(x[i]<mid)
			i++;
		if(i<=j)
		{
			swap(x[i],x[j]);
			i++;
			j--;
		}
	}
	while(i<=j);
	//快排后数组被划分为三块: l<=j<=i<=r
	if(k<=j) qsort(l,j);//在左区间只需要搜左区间
	else if(i<=k) qsort(i,r);//在右区间只需要搜右区间
	else //如果在中间区间直接输出
	{
		printf("%d",x[j+1]);
		exit(0);
	}
}
int main()
{
	int n;
	scanf("%d%d",&n,&k);
	for(int i=0;i<n;i++)
		scanf("%d",&x[i]);
	qsort(0,n-1);
}

学习日志

1、c++中scanf比cin的输入快,尤其是在大、多的数据的时候。

2、我是在codeblocks中写了一个c++代码,出现的这个问题也是有点莫名其妙,因为没有编译错误也没用运行时错误,就是直接退出。

初始化了一个相当大的数组,导致内存溢出,从而导致整个函数(即便是在初始化这个数组之前的代码)未执行,并导致整个程序直接退出!
但是!!!这里的重点不在于定义了一个相当大的数组,而在于内存溢出!临时变量放到堆栈里,堆栈比变量小,就是你说得不能运行。实际上是堆栈溢出。

 

微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码
C语言是一种广泛应用于系统编程和嵌入式开发的高级编程语言。函数指针是C语言中的一个重要概念,它可以指向函数,并且可以通过函数指针来调用函数。快速排序算法是一种常用的排序算法,它的核心思想是通过分治的策略将一个大问题分解为多个小问题,并通过递归的方式解决这些小问题。 下面是C语言中使用函数指针实现快速排序算法的示例代码: ```c #include <stdio.h> // 交换两个元素的值 void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } // 快速排序的分区函数 int partition(int arr[], int low, int high) { int pivot = arr[high]; // 选取最后一个元素作为基准 int i = (low - 1); // 定义一个指针,用于指向小于基准的元素 for (int j = low; j <= high - 1; j++) { if (arr[j] < pivot) { i++; swap(&arr[i], &arr[j]); } } swap(&arr[i + 1], &arr[high]); return (i + 1); } // 快速排序函数 void quickSort(int arr[], int low, int high) { if (low < high) { int pi = partition(arr, low, high); // 将数组分区,并获取分区点的位置 quickSort(arr, low, pi - 1); // 对分区点左边的子数组进行快速排序 quickSort(arr, pi + 1, high); // 对分区点右边的子数组进行快速排序 } } // 打印数组元素 void printArray(int arr[], int size) { for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); } int main() { int arr[] = {10, 7, 8, 9, 1, 5}; int n = sizeof(arr) / sizeof(arr[0]); printf("原始数组:"); printArray(arr, n); quickSort(arr, 0, n - 1); printf("排序后的数组:"); printArray(arr, n); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值