数据结构习题——荷兰国旗等快排相关

前言

关于排序

正文

关于快排的一些题目

题目一

顺序存储的线性表,设计把所有奇数移动到偶数前面的算法(要求时间最少,辅助空间最少)

void move(int a[],int n){
	 int low=0,high=n-1;
	 int i=low,j=high;
	 while(i<j){
	 	while(i<j&&a[i]%2!=0)i++;//找到偶数 
	 	while(i<j&&a[j]%2==0)j--;//找到奇数
	 	if(i<j){
	 		swap(a[i],a[j]); 
	 		i++;j--;
		 }
	 }
}

题目二

找出第K小的元素
可以用很多中方法,排序好找到第K个位置上的即可
这里借助快排的特点:每次遍历就可以确定一个在最终位置上的元素。

int find_k(int a[],int low,int high,int k){
/*快速排序的划分过程*/
	int pivot,i,j;
	i=low,j=high;
	pivot=a[0];
	while(i<j){
		while(i<j&&a[j]>pivot) j--;
		   a[low]=a[high];
        while(i<j&&a[i]<pivot) i++;
           a[high]=a[low];
	}
	a[i]=pivot;
	/*本题思想*/
	if(i==k)
       return a[i]; //由于与K相同,直接返回pivot 元素
    else if(i>k)
       return find_k(a,low,i-1,k); //在前面部分中递归找
    else
       return find_k(a,i+1,high,k);//在后面部分中低估找
}

题目三

荷兰国旗问题,把由红,白,蓝三种颜色组成的条块序列,排序成为以红、白、蓝顺序组成的序列。
本题和快排也有非常相似,用到了三个指针,j为工作指针,i以前元素全部为红色,k以后的元素全部为蓝色,根据j所指示的元素信息,决定将其交换到序列的前部或者尾部。

#include <stdio.h>
void swap(char a,char b);
void sort(char a[],int n);
int main(){
	char a[]="brrwbwr";
	sort(a,7);
	printf("%s",a);
} 
void sort(char a[],int n){
	 int i=0,j=0,k=n-1;
	 while(j<=k){
	 	switch(a[j]){//判断条块的颜色
	 		case 'r':swap(&a[i],&a[j]);i++;j++;break;//红色则和i交换
	 		case 'w':j++;break;//蓝色则和k交换
	 		case 'b':swap(&a[j],&a[k]);k--;//这里没有j++语句防止交换后a[j]仍为蓝色的情况
		 }
	 }
}
void swap(char *a,char *b){
	char c=*a;
	*a=*b;
	*b=c;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值