排序代码实现

来源:互联网 发布:阿隆戈登数据 虎扑nba 编辑:程序博客网 时间:2024/06/11 23:44
/* 快速排序*/#include <iostream>#include <stdio.h>#include <string>#include <string.h>#include <algorithm>using namespace std;const int MAXN=100;int s[MAXN];int AdjustArray(int s[],int l,int r){    int i=l,j=r;    int x=s[l];    while(i<j)    {        while( i<j && s[j]>=x)            j--;        if(i<j)            s[i++]=s[j];        while( i<j && s[i]<x  )            i++;        if(i<j)            s[j--]=s[i];    }    s[i]=x;    return i;}void Quick_Sort(int s[],int l,int r){    if(l<r)    {       int i=AdjustArray(s,l,r);       Quick_Sort(s,l,i-1);       Quick_Sort(s,i+1,r);    }}int main(){    int n;    while(cin>>n)    {       if(n>=MAXN)       {         printf("缓冲区溢出,");         exit(0);       }       for(int i=1;i<=n;i++)cin>>s[i];    }    return 0;}/*   归并排序*///将有二个有序数列a[first...mid]和a[mid...last]合并。  void mergearray(int a[], int first, int mid, int last, int temp[])  {      int i = first, j = mid + 1;      int m = mid,   n = last;      int k = 0;            while (i <= m && j <= n)      {          if (a[i] <= a[j])              temp[k++] = a[i++];          else              temp[k++] = a[j++];      }            while (i <= m)          temp[k++] = a[i++];            while (j <= n)          temp[k++] = a[j++];            for (i = 0; i < k; i++)          a[first + i] = temp[i];  }  void mergesort(int a[], int first, int last, int temp[])  {      if (first < last)      {          int mid = (first + last) / 2;          mergesort(a, first, mid, temp);    //左边有序          mergesort(a, mid + 1, last, temp); //右边有序          mergearray(a, first, mid, last, temp); //再将二个有序数列合并      }  }    bool MergeSort(int a[], int n)  {      int *p = new int[n];      if (p == NULL)          return false;      mergesort(a, 0, n - 1, p);      delete[] p;      return true;  }  /*  堆排序*//*堆排序(大顶堆)*/ #include <iostream>#include<algorithm>using namespace std;void HeapAdjust(int *a,int i,int size)  //调整堆 {    int lchild=2*i;       //i的左孩子节点序号     int rchild=2*i+1;     //i的右孩子节点序号     int max=i;            //临时变量     if(i<=size/2)          //如果i是叶节点就不用进行调整     {        if(lchild<=size&&a[lchild]>a[max])        {            max=lchild;        }            if(rchild<=size&&a[rchild]>a[max])        {            max=rchild;        }        if(max!=i)        {            swap(a[i],a[max]);            HeapAdjust(a,max,size);    //避免调整之后以max为父节点的子树不是堆         }    }        }void BuildHeap(int *a,int size)    //建立堆 {    int i;    for(i=size/2;i>=1;i--)    //非叶节点最大序号值为size/2     {        HeapAdjust(a,i,size);        }    } void HeapSort(int *a,int size)    //堆排序 {    int i;    BuildHeap(a,size);    for(i=size;i>=1;i--)    {        //cout<<a[1]<<" ";        swap(a[1],a[i]);           //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面           //BuildHeap(a,i-1);        //将余下元素重新建立为大顶堆           HeapAdjust(a,1,i-1);      //重新调整堆顶节点成为大顶堆    }} int main(int argc, char *argv[]){     //int a[]={0,16,20,3,11,17,8};    int a[100];    int size;    while(scanf("%d",&size)==1&&size>0)    {        int i;        for(i=1;i<=size;i++)            cin>>a[i];        HeapSort(a,size);        for(i=1;i<=size;i++)            cout<<a[i]<<"";        cout<<endl;    }    return 0;}<pre name="code" class="cpp">#include <stdio.h>#include <stdlib.h>//节点数据结构struct node{int val;//值int bf;//平衡因子struct node* left;struct node* right;}; struct node* root;//struct node* top;//获得父节点的函数struct node* GetFather(struct node* son){struct node* temp;if(son==root)return NULL;temp=root;while(1){if(temp==NULL)return NULL;else if(son->val<=temp->val){if(temp->left == son)return temp;else{temp = temp->left;continue;}}else if(son->val>temp->val){if(temp->right == son)return temp;else{temp = temp->right;continue;}}}} //LL类型旋转int RorateLL(struct node* inode, struct node* blance){struct node* father;struct node* left;left = blance->left;if(father=GetFather(blance)){if(blance->val<=father->val)father->left = left;else father->right = left;}elseroot = left;left->bf = 0;blance->bf = 0;blance->left = left->right;left->right=blance;father = left->left;while(father!=inode){if(inode->val<=father->val){father->bf++;father = father->left;}else{father->bf--;father = father->right;} }}//RR类型旋转int RorateRR(struct node* inode, struct node* blance){struct node* father;struct node* right;right = blance->right;if(father=GetFather(blance)){if(blance->val<=father->val)father->left = right;else father->right = right;}else root = right;right->bf = 0;blance->bf = 0;blance->right = right->left;right->left=blance;father = right->right;while(father!=inode){if(inode->val<=father->val){father->bf++;father = father->left;}else{father->bf--;father = father->right;} }}//LR类型旋转int RorateLR(struct node* inode, struct node* blance){struct node* father;struct node* newtop;father = blance;while(father!=inode){if(inode->val<=father->val){father->bf++;father = father->left;}else{father->bf--;father = father->right;} } newtop = blance->left->right;if(father=GetFather(blance)){ if(blance->val<=father->val)father->left = newtop;else father->right = newtop;}else root = newtop;blance->left->right = newtop->left;newtop->left = blance->left;blance->left = newtop->right;newtop->right=blance;if(newtop->bf == 0){newtop->left->bf==0;newtop->right->bf==0;}else if(newtop->bf == 1){newtop->left->bf==0;newtop->right->bf==-1;}else if(newtop->bf == -1){newtop->left->bf==1;newtop->right->bf==0;}return 1; }//RL类型旋转int RorateRL(struct node* inode, struct node* blance){struct node* father;struct node* newtop;father = blance;while(father!=inode){if(inode->val<=father->val){father->bf++;father = father->left;}else{father->bf--;father = father->right;} } newtop = blance->right->left;if(father=GetFather(blance)){ if(blance->val<=father->val)father->left = newtop;else father->right = newtop;}else root=newtop;blance->right->left = newtop->right;newtop->right = blance->right;blance->right = newtop->left;newtop->left=blance;if(newtop->bf == 0){newtop->left->bf==0;newtop->right->bf==0;}else if(newtop->bf == 1){newtop->right->bf==0;newtop->left->bf==-1;}else if(newtop->bf == -1){newtop->right->bf==1;newtop->left->bf==0;}return 1; }//插入函数int AvlInsert(struct node* inode){struct node* blance;struct node* temp;temp=root;while(1){if(temp->bf==1|temp->bf==-1)blance = temp;if(inode->val<=temp->val){if(temp->left){temp=temp->left;continue;}else{temp->left=inode;break;}}else if(inode->val>temp->val){if(temp->right){temp=temp->right;continue;}else{temp->right=inode;break;}}} if(!blance){temp=root;while(temp!=inode){if(inode->val<=temp->val){temp->bf++;temp=temp->left;}else{temp->bf--;temp=temp->right;} }return 1; }else{if(blance->bf==-1 && blance->val>=inode->val || blance->bf==1 && blance->val<inode->val){blance->bf=0;return 1;}else if(inode->val<=blance->val && inode->val<=blance->left->val)RorateLL(inode, blance);else if(inode->val<=blance->val && inode->val>blance->left->val)RorateLR(inode, blance);else if(inode->val>blance->val && inode->val<=blance->right->val)RorateRL(inode, blance);else if(inode->val>blance->val && inode->val>blance->right->val)RorateRR(inode, blance); }return 1; } int AvlCreate(struct node* inode){ if(!root){root = inode;return 1;}AvlInsert(inode); } //打印整个树的函数void Traveser(struct node* r){        if(r->left) Traveser(r->left);     if(r) printf("%d, %d\n",r->val, r->bf);     if(r->right) Traveser(r->right);   } int main(){ int a;struct node* Node;while(1){scanf("%d",&a);if (a==-1)break;Node = malloc(sizeof(struct node));Node->val=a;Node->bf=0;Node->left=NULL;Node->right=NULL;AvlCreate(Node);}Traveser(root); }

                                             
0 0
原创粉丝点击