排序应用(一)

时间最少,辅助空间最少,把所有奇数移动到偶数前边

思想:从顺序表的两边同时遍历进行奇偶交换

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];
    }
}

 

 

转载于:https://www.cnblogs.com/Yshun/p/11545959.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值