数据结构-排序进阶代码

来源:互联网 发布:淘宝网店怎么激活 编辑:程序博客网 时间:2024/06/18 10:55

1.插入排序中找插入位置的操作可以通过二分查找法来实现。请设计一个这样的改进的插入排序算法。

void InsertSort(int A[], int n){//排序是A[0]~A[n]int i,j,low,high,mid;for(i=2;i<=n;i++){A[0]=A[i];low=1;high=i-1;while(low<=high){mid=(low+high)/2;if(A[mid]>A[0])high=mid-1;//查找左半子表elselow=mid+1//查找右半子表}for(j=i-1;j>=high+1;--j)A[j+1]=A[j];A[high+1]=A[0];}}


2.快速排序算法中,如何选取一个界值(又称为轴元素分割线),影响着快排的效率,且界值夜并不一定是被排序的序列中的一个元素。例如,我们可以用被排序的序列中所有元素的平均值作为界值。试编写一个算法实现以平均值为界值得快速排序算法。

void QuickSort(int A[], int n){QSort(A,0,n-1);//从数组下标为0开始排}void QSort(int A[],int left,int right){int i,j;if(left<right){int pivot=0;//界值for(i=left;i<=right;i++)pivot=pivot+A[i];pivot=pivot(right-left+1);i=left;j=right+1;do{do i++; while(A[i]<pivot&&i<=right);do j--; while(A[j]>pivot&&j>=left);if(i<j)Swap(A[i],A[j]);}while(i<j)Swap(A[left],A[j]);QSort(A,left,j);QSort(A,j+1,right);}}

 

3.奇偶交换排序是另外一种交换排序。它的第一趟对序列中的所有奇数项i扫描,第二趟对序列中的所有偶数项i扫描。若A[i]>A[i+1],则交换他们。第三趟又对所有奇数项,第四趟对所有的偶数项,如此反复,直到整个序列全部排序好为止。

void odd-evenSort(int A[],int Size){int i,exchange;do{for(i=1;i<Size;i+=2)if(A[i]>A[i+1]){exchange=1;Swap(A[i],A[i+1]);}for(i=0;i<Size;i+=2)if(A[i]>A[i+1]){exchage=1;Swap(A[i],A[i+1]);}}while(exchage!=0)}


4.设数组中存放了一个无序的关键字序列K0、K1、……..、Kn-1。现要将一指定的元素Ki放在该元素在排序之后的正确位置上(例如,对于序列23,12,8,45,38而言,元素23排序后应放在2号位,从0开始编号),试编写算法实现上述功能,要求比较次数不超过n。

void SetLoc(int K[],int n,int i){//将下标为i的元素归为if(i<0||i>=n){cout<<”The index i is illegal”;return;}int seq=0;for(int j=0;i<n;j++)if(K[j]<k[i])seq++;Swap(K[i],K[seq]);}

5.上题参考快排的思想

void SetLoc(int A[],int n,int i){int k=0,j=n+1;//排序为0~n,n后面是无穷大do{do k++; while(A[k]<A[i]);do j--;while(A[j]>A[i]);if(i<j)Swap(A[i],A[j]);}while(k<j);Swap(A[left],A[j]);}


原创粉丝点击