提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
请大家带着认真读这篇文章,因为这是梦想开始的地方
提示:以下是本篇文章正文内容,下面案例可供参考
一、快速排序
示例:让一些数字以从大到小或从小到大排序的一种方法.
1.输入和输出
代码如下(示例):
//基础输入输出
#include<stdio.h>
int main()
{
int arr[100010];
int n,k;
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++) scanf("%d",&arr[i]);
quick_sort(arr,0,n-1);
for(int i=0;i<n;i++)
{
if(i+1==k) printf("%d",arr[i]);
}
return 0;
}
2.函数书写
代码如下(示例):
void quick_sort(int arr[],int l,int r)
{
if(l>=r) return; //特殊情况特殊讨论
int i=l-1,j=r+1,x=arr[l]; //第一点 指针思想,i是初始指针,j是末尾指针然后通过左右遍历去
//实现交换,指针配合reverse逆序其实这种思想很常见,只能说见怪不怪吧。
//第二点就是x=arr[l]就是以这个值为边界,去左边排比他大的或小的 右边排比他小或大的.
while(i<j)
{
do i++;while(arr[i]<x);
do j--;while(arr[j]>x);
if(i<j)
{
int tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
}
quick_sort(arr,l,j); //递归实现左边可以顺序
quick_sort(arr,j+1,r);//递归实现右边可以顺序
}
3.总代码的默写
#include<stdio.h>
void quick_sort(int arr[],int l,int r)
{
if(l>=r) return;
int i=l-1,j=r+1,x=arr[l];
while(i<j)
{
do i++;while(arr[i]<x);
do j--;while(arr[j]>x);
if(i<j)
{
int tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
}
quick_sort(arr,l,j);
quick_sort(arr,j+1,r);
}
int main()
{
int arr[100010];
int n,k;
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++) scanf("%d",&arr[i]);
quick_sort(arr,0,n-1);
for(int i=0;i<n;i++)
{
if(i+1==k) printf("%d",arr[i]);
}
return 0;
}
//我再强调一遍,一定要把模板会背,并且练到纯熟.
二、归并排序
1.输入和输出
#include<stdio.h>
const int N=100010;
int arr[N],tmp[N];
void merge_sprt(int arr[],int l,int r)
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&arr[i]);
merge_sprt(arr,0,n-1);
for(int i=0;i<n;i++) printf("%d ",arr[i]);
return 0;
}
2.函数书写
void merge_sprt(int arr[],int l,int r)
{
if(l>=r) return;
int mid=(l+r)/2;//归并思想其实就是分治二分,所以用到了mid
merge_sprt(arr,l,mid),merge_sprt(arr,mid+1,r);//把大于这个的放到一边,不大于的放到另一边
int i=l,j=mid+1,k=0;
while(i<=mid&&j<=r)//这里tmp[]类似于book[]数组名作用就是装入到里面而已.
{
if(arr[i]<=arr[j]) tmp[k++]=arr[i++];
else tmp[k++]=arr[j++];
}
while(i<=mid) tmp[k++]=arr[i++];
while(j<=r) tmp[k++]=arr[j++];
for(int i=l,j=0;i<=r;i++,j++) arr[i]=tmp[j];//当然装了还要物归原主的,方便打印的.
}
3.总代码的默写
#include<stdio.h>
const int N=100010;
int arr[N],tmp[N];
void merge_sprt(int arr[],int l,int r)
{
if(l>=r) return;
int mid=(l+r)/2;
merge_sprt(arr,l,mid),merge_sprt(arr,mid+1,r);
int i=l,j=mid+1,k=0;
while(i<=mid&&j<=r)
{
if(arr[i]<=arr[j]) tmp[k++]=arr[i++];
else tmp[k++]=arr[j++];
}
while(i<=mid) tmp[k++]=arr[i++];
while(j<=r) tmp[k++]=arr[j++];
for(int i=l,j=0;i<=r;i++,j++) arr[i]=tmp[j];
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&arr[i]);
merge_sprt(arr,0,n-1);
for(int i=0;i<n;i++) printf("%d ",arr[i]);
return 0;
}
练习题目:、
题意理解
这道题目显然是要我们将一个无序数列排序,成为具有升序性质的升序序列.
算法处理
一道排序题目,数据范围是关键,我们发现这道题目只能让我们使用O(nlogn)O(nlogn)的算法,显然我们可以选择快速排序,归并排序等算法,这里我们就使用快速排序
#include<stdio.h>
int arr[100010];
void quick_sort(int arr[],int l,int r)
{
if(l>=r) return;
int i=l-1,j=l+1,x=arr[l];
while(i<j)
{
do i++;while(arr[i]>x);
do j--;while(arr[j]<x);
if(i<j)
{
int tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
}
quick_sort(arr,l,j);
quick_sort(arr,j+1,r);
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&arr[i]);
quick_sort(arr,0,n-1);
for(int i=0;i<n;i++) printf("%d ",arr[i]);
return 0;
}
#include<stdio.h>
void quick_sort(int arr[],int l,int r)
{
if(l>=r) return;
int i=l-1,j=r+1,x=arr[l];
while(i<j)
{
do i++;while(arr[i]<x);
do j--;while(arr[j]>x);
if(i<j)
{
int tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
}
quick_sort(arr,l,j);
quick_sort(arr,j+1,r);
}
int main()
{
int arr[100010];
int n,k;
scanf("%d %d",&n,&k);
for(int i=0;i<n;i++) scanf("%d",&arr[i]);
quick_sort(arr,0,n-1);
for(int i=0;i<n;i++)
{
if(i+1==k) printf("%d",arr[i]);
}
return 0;
}
题意理解
题意很清晰,就是让我们使用快速排序算法,求解第K小的数.
算法选择
快速排序算法,显然是我们不二选择.毕竟这是一道模板题目
题意理解
这道题目还是让我们排序,只不过这里强制要求我们使用归并排序,所以既然如此的话,让我们好好地康康这道题目.
算法处理
归并排序,它有两大核心操作.
一个是将数组一分为二,一个无序的数组成为两个数组.
另外一个操作就是,合二为一,将两个有序数组合并成为一个有序数组.
#include<stdio.h>
const int N=100010;
int arr[N],tmp[N];
void merge_sprt(int arr[],int l,int r)
{
if(l>=r) return;
int mid=(l+r)/2;
merge_sprt(arr,l,mid),merge_sprt(arr,mid+1,r);
int i=l,j=mid+1,k=0;
while(i<=mid&&j<=r)
{
if(arr[i]<=arr[j]) tmp[k++]=arr[i++];
else tmp[k++]=arr[j++];
}
while(i<=mid) tmp[k++]=arr[i++];
while(j<=r) tmp[k++]=arr[j++];
for(int i=l,j=0;i<=r;i++,j++) arr[i]=tmp[j];
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&arr[i]);
merge_sprt(arr,0,n-1);
for(int i=0;i<n;i++) printf("%d ",arr[i]);
return 0;
}