数据结构-排序进阶代码
生活随笔
收集整理的這篇文章主要介紹了
数据结构-排序进阶代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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]); }
總結
以上是生活随笔為你收集整理的数据结构-排序进阶代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工科计算机考研311分今年能上吗,202
- 下一篇: dhcp服务器显示2个ip,下列关于Wi