考研 ing
努力努力再努力
**
1.双向冒泡
void bubble(ElemType A[],int n){
int low=0,high=n-1;
bool flag=true;
while(low<high&&flag){
flag=false;
for(i=low;i<high;i++){
if(A[i]>A[i+1])
swap;
flag=true;
}
high--;
for(i=high;i>low;i--){
if(A{i]<A[i-1])
swap;
flag=true;
}
low++;
}
}
2.奇数偶数各一边
void move(ElemType A[],int len){
int i=0,j=len-1;
while(i<j){
while(i<j&&A[i]%2!=0) i++;
while(i<j&&A[j}%2==0) j--;
if(i<j)
swap(A[i],A[j]);
i++,j--;
}
}
3.快速排序(新编)
int partition(ElemType A[],int low,int high){
int rad=low+rand()%(high-low+1);
swap(A[rad],A[low]);
pivot=A[low];
int i=low;
for(j=low+1;j<=high;j++)
if(A[j]<pivot)
swap(A[++i],A[j]);
swap(A[i],A[low]);
return i;
}
4.找出数组中第k小的元素
int k_min(ElemType 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_min(A,low_temp,low-1,k);
else
return k_min(A,low+1,high_temp,k);
}
5.寻找个数差最小且和差最大
int setpartition(int A[],int n){
int low=low0=0,high=high0=n-1;
int flag=1,k=n/2;
int s1=s2=0;
pivot=A[low];
while(flag){
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];
}
if(low==k-1)
flag=0;
else if(low>k-1)
high=high--,low=low0;
else
low=low++,high=high0;
}
for(i=0;i<k;i++)
s1+=A[i];
for(i=k;i<n;i++)
s2+=A[i];
return s2-s1;
}
6.荷兰国旗
typedef enum{red,white,blue} color;
void flag_arrange(color A[],int n){
int i=j=0,k=n-1;
while(j<k){
switch(A[j]){
case red:swap(A[i],A[j]),i++,j++;break;
case white:j++;break;
case blue:swap(A[j],A[k]),k--;break;
}
}
}
7.单链表实现简单选择排序
void selectsort(LinkList &L){
LinkNode *h=L,*p,*q,*r,*s;
L=NULL;
while(h!=NULL){
p=s=h,q=r=NULL;
while(p){
if(p->data>s->data)
s=p,r=q;
q=p
p=p->next;
}
if(s==h)
h=h->next;
else
r->next=s->next;
s->next=L,L=s;
}
}
8.判断是否为小根堆
bool isminheap(ElemType A[],int len){
if(n%2==0){
if(A[len/2]>A[len])
return flase;
for(i=len/2-1;i>=1;i--)
if(A[i]>A{2*i]||A[i]>A[2*i+1])
return false;
}
else{
for(i=len/2;i>=1;i--)
if(A[i]>A{2*i]||A[i]>A[2*i+1])
return false;
}
return true;
}
9.直接插入排序实现两有序表合并
void insert_sort(ElemType A[],int m,int n){
for(i=m+1;i<=n+m;i++){
A[0]=A[i];
for(j=i-1;A{j]>A[0];j--)
A[j+1]=A[j];
A[j+1]=A[0];
}
}
10.记数排序
1st:每次都选取一个记录跟所有记录比较。
void countsort(ElemType A[],RecType B[],int n){
for(i=0;i<n;i++){
count=0;
for(j=0;j<n;i++)
if(A[i].key>A[j].key)
count++;
B[count]=A[i];
}
}
2st:任意两个元素只能比较一次。
//思想:增加count域,越小元素count越小
part: for(i=0;i<n;i++)
A[i].count=0;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(A[i].key>A[j].key)
A[i].count++;
else
A[j].count++;
11.数组元素到合适位置
int partition(ElemType K[],int n){
int i=1,j=n;
ElemType pivot=K[j];
while(i<j){
while(i<j&&K[i]<=pivot)
i++;
if(i<j)
K[j]=K[i];
while(i<j&&K[j]>pivot)
j--;
if(i<j)
K[i]=K[j];
}
K[i]=pivot;
return i;
}