1. bubbleSort冒泡排序法中 in索引变量都是从左到右移动的,直到找到最大数据项并把它移动到右边的out变量处。修改bubbleSort()方法,使他成为双向移动的。这样,in索引先像先前一样,将最大的数据项从左移动到右,当它到达out变量位置时,它掉头并把最小的数据项从右移动到左。需要两个外部索引变量,一个在右边(以前的out变量),另一个在左边。
我的分析:一般的冒泡排序法是反复的从左到右相邻比较,交换,而要求的修改是双向,应该叫做“冒泡”的同时还要“沉底”,因此需要2个索引变量。写出下列函数。
- //.......................................................
- public void bubbleSort()
- {
- int out,in;
- int inner=0;//索引
- long temp;
- for(out=nElems-1;out>nElems/2-1;out--)//out索引,同时冒泡沉底
- {
- for(in=inner;in<out;in++)//from left to right to bubble
- {
- if(a[in]>a[in+1])
- {temp=a[in+1];
- a[in+1]=a[in];
- a[in]=temp;
- }
- }
- for(in=out-1;in>inner;in--)//from right to left to sink
- {
- if(a[in-1]>a[in])
- {
- temp=a[in-1];
- a[in-1]=a[in];
- a[in]=temp;
- }
- }
- inner++;
- }
- }
- //.......................................................
2.增加一个名为noDups()的方法,这个方法从已经有序的数组中删掉重复的数据项而不破坏有序性。一种解决方法是没发现一个重复的数据,就从这个哦位置开始到数组结尾都镶嵌移动一个位置,但这样就导致消耗很长的O(N*N)的时间级,起码在有很多重复数据项的情况下是这样的。在设计的算法中,不论有多少重复数据,要确保数据项最多只移动一次。这样算法就只消耗O(N)数量级的时间。
分析:既然不能每遇到重复项就拿后面的项覆盖前面的,那么就必须知道重复项的个数(假定调用一次noDups()解决一个数据项重复问题)。算法如下:
- //......................................................
- public void noDups()
- {
- int i,j;
- int counter=0;
- for(i=0;i<nElems;i++)//the main loop
- {
- if(a[i]==a[i+1])//遇到重复的数据时的操作
- {
- counter++;//计数器加1
- if(a[i+1]!=a[i+2])break;
- }//遇到不再重复的项后的操作
- }
- for(j=i;j<nElems;j++)
- {
- a[j+2-counter]=a[j+2];//
- }
- nElems=nElems-counter;//
- counter=0;//reset the couter
- }