数据结构(C语言版) 排序 算法设计Demo3
Posted Aiden (winner)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构(C语言版) 排序 算法设计Demo3相关的知识,希望对你有一定的参考价值。
设有顺序放置的n个桶,每个桶中装有一粒砾石,每粒砾石的颜色是红,白,蓝之一。要求重新安排这些砾石,使得所有红色砾石在前,所有白色砾石居中,所有蓝色砾石居后,重新安排时对每粒砾石的颜色只能看一次,并且只允许交换操作来调整砾石的位置。
[题目分析]
利用快速排序思想解决。由于要求“对每粒砾石的颜色只能看一次”,设3个指针i,j和k,分别指向红色、白色砾石的后一位置和待处理的当前元素。从k=n开始,从右向左搜索,若该元素是兰色,则元素不动,指针左移(即k-1);若当前元素是红色砾石,分i>=j(这时尚没有白色砾石)和i<j两种情况。前一情况执行第i个元素和第k个元素交换,之后i+1;后一情况,i所指的元素已处理过(白色),j所指的元素尚未处理,应先将i和j所指元素交换,再将i和k所指元素交换。对当前元素是白色砾石的情况,也可类似处理。
为方便处理,将三种砾石的颜色用整数1、2和3表示。
[算法描述]
void QkSort(rectype r[],int n)
// r为含有n个元素的线性表,元素是具有红、白和兰色的砾石,用顺序存储结构存储,
//本算法对其排序,使所有红色砾石在前,白色居中,兰色在最后。
int i=1,j=1,k=n,temp;
while (k!=j)
while (r[k].key==3) k--;// 当前元素是兰色砾石,指针左移
if (r[k].key==1) // 当前元素是红色砾石
if (i>=j)temp=r[k];r[k]=r[i];r[i]=temp; i++;
//左侧只有红色砾石,交换r[k]和r[i]
else
temp=r[j];r[j]=r[i];r[i]=temp; j++;
//左侧已有红色和白色砾石,先交换白色砾石到位
temp=r[k];r[k]=r[i];r[i]=temp; i++;
//白色砾石(i所指)和待定砾石(j所指)
//再交换r[k]和r[i],使红色砾石入位。
if (r[k].key==2)
if (i<=j) temp=r[k];r[k]=r[j];r[j]=temp; j++;
// 左侧已有白色砾石,交换r[k]和r[j]
elsetemp=r[k];r[k]=r[i];r[i]=temp; j=i+1;
//i、j分别指向红、白色砾石的后一位置
//while
if (r[k]==2) j++; //处理最后一粒砾石
else if(r[k]==1) temp=r[j];r[j]=r[i];r[i]=temp; i++; j++;
//最后红、白、兰色砾石的个数分别为: i-1;j-i;n-j+1
//结束QkSor算法
[算法讨论]
若将j(上面指向白色)看作工作指针,将r[1…j-1]作为红色,r[j…k-1]为白色,r[k…n]为兰色。从j=1开始查看,若r[j]为白色,则j=j+1;若r[j]为红色,则交换r[j]与r[i],且j=j+1,i=i+1;若r[j]为兰色,则交换r[j]与r[k];k=k-1。算法进行到j>k为止。
算法片段如下:
int i=1,j=1,k=n;
while(j<=k)
if (r[j]==1) //当前元素是红色
temp=r[i]; r[i]=r[j]; r[j]=temp; i++; j++;
else if (r[j]==2) j++; //当前元素是白色
else //(r[j]==3 当前元素是兰色
temp=r[j]; r[j]=r[k]; r[k]=temp; k--;
对比两种算法,可以看出,正确选择变量(指针)的重要性。
以上是关于数据结构(C语言版) 排序 算法设计Demo3的主要内容,如果未能解决你的问题,请参考以下文章