时间最少,辅助空间最少,把所有奇数移动到偶数前边
思想:从顺序表的两边同时遍历进行奇偶交换
void move1(){ int A[6]={4,5,1,2,6,3}; int temp; int i=0,j=5; while(i<j){ while(A[i]%2==1){i++;} while(A[j]%2==0){j--;} if(i<j){ temp=A[i]; A[i]=A[j]; A[j]=temp; } i++; j--; } for(int i=0;i<6;i++){ printf("%d ",A[i]); } printf("\n"); }
找出第k个小的元素
int k_elem(int A[],int low,int high,int k){ int pivot=A[low]; int low_temp=low; int high_temp=high; while(low<high){ while(low<high&&A[high]>=pivot){high--;} A[low]=A[high]; while(low<high&&A[low]<=pivot){low++;} A[high]=A[low]; } A[low]=pivot; if(low==k){return A[low];} else if(low<k){return k_elem(A,low+1,high_temp,k);} else {return k_elem(A,low_temp,low-1,k);} }
将一个线性表分成两部分使得两者元素相差最少且元素的和相差最大
void SetPartition(int A[],int low,int high,int n){ int pivot=A[low]; int k=n/2; int flag=1;//标志是否找到中间的位置 int low_temp=0; int high_temp=n-1; int s1[7]; int s2[7]; while(flag==1){ while(low<high&&A[high]>=pivot){high--;} A[low]=A[high]; while(low<high&&A[low]<=pivot){low++;} A[high]=A[low]; A[low]=pivot; if(low==k-1){flag=0;} else if(low>k-1){ high_temp=high-1; low=low_temp; } else{ low_temp=low+1; high=high_temp; } } for(int i=0;i<k;i++){s1[i]=A[i];} for(int i=0;i<k;i++){printf("%d ",s1[i]);} printf("\n"); for(int i=k;i<n;i++){s2[i]=A[i];} for(int i=k;i<n;i++){printf("%d ",s2[i]);} printf("\n"); }
简单选择排序在链表上实现
void LinkSelectSort(LinkList &L){ LinkList p,q; LinkList r; int temp; p=L->next; while(p!=NULL){ q=p; r=p; while(q!=NULL){ if(q->data<r->data){ r=q; } q=q->next; } q=p; while(q!=NULL){ if(q==r){ temp=p->data; p->data=r->data; r->data=temp; } q=q->next; } p=p->next; } }
一个数组有由两个各自有序的数组组成,将其调整成一个完整的有序数组
void InsortSort(int A[],int m,int n){ int i,j; for(i=m+1;i<m+n;i++){ A[0]=A[i]; for(j=i-1;A[j]>A[0];j--){ A[j+1]=A[j]; } A[j+1]=A[0]; } }