前言
关于排序
正文
关于快排的一些题目
题目一
顺序存储的线性表,设计把所有奇数移动到偶数前面的算法(要求时间最少,辅助空间最少)
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;
}