C++ 排序

#include<iostream>
using namespace std;
#include<ctime>
#include<cstdlib>
typedef int KeyType;
typedef char * InfoType;
typedef struct
{
    KeyType key;
    InfoType otherinfo;
}ElemType;
typedef struct
{
    ElemType *R;
    int length;
}SqList;

int CmpNum0;
int CmpNum1;
int CmpNum2;
int CmpNum3;

void CreateList(SqList &L,int n)
{
    int i;
    L.R=new ElemType[n+1];
    srand(time(0));
    for(i=1;i<=n;i++)
    {
        L.R[i].key=rand()%100;    
    }
    L.length=n;
}

void ListTraverse(SqList L)
{
    int i;
    for(i=1;i<=L.length;i++)
        cout<<L.R[i].key<<'\t';
    cout<<endl;
}

void BubbleSort(SqList &L)
{
    int m,flag,i;
    m=L.length-1;flag=1;
    while(m>0&&flag)
    {
        flag=0;
        for(i=1;i<=m;i++)
        {
            CmpNum0++;
            if(L.R[i].key>L.R[i+1].key)
            {
                flag=1;
                L.R[0]=L.R[i+1];
                L.R[i+1]=L.R[i];
                L.R[i]=L.R[0];
            }
        }
        m--;
    }
}

 

void InsertSort(SqList &L)
{    //对顺序表L做直接插入排序
        int i,j;
        for(i=2;i<=L.length;++i)
        {
            CmpNum1++;
            if(L.R[i-1].key>L.R[i].key)       //">"需将R[i]插入有序子表
            
            {
                L.R[0]=L.R[i];        //将待插入的记录暂存到监视哨中
                L.R[i]=L.R[i-1];      //R[i-1]后移
                for(j=i-2;L.R[0].key<L.R[j].key;--j)   //从后面向前寻找插入位置
                    L.R[j+1]=L.R[j];      //记录逐个后移,直到找到插入位置
                L.R[j+1]=L.R[0];      //将R[0]即原R[i],插入到正确位置
            }
        }
}

 

void BInsertSort(SqList &L)
{      //对顺序表L做折半插入排序
        int i,j,low,high,m;
        for(i=2;i<=L.length;++i)
        {
            CmpNum2++;
            L.R[0]=L.R[i];          //将待插入的记录暂存到监视哨中
            low=1;high=i-1;        //置查找区间初值
            while(low<=high)       //在R[low...high]中折半查找插入的位置
            {
                m=(low+high)/2;     //折半
                if(L.R[m].key>L.R[0].key) high=m-1;   //插入点在前一子表
                else low=m+1;    //插入点在后一子表
                
            }
            for(j=i-1;j>=high+1;--j)    
                L.R[j+1]=L.R[j];          //记录后移 
            L.R[high+1]=L.R[0];        //将R[0]即原R[i],插入到正确位置
        }
}

 

 

int Partition(SqList &L,int low,int high)
{
    L.R[0]=L.R[low];
    int pivotkey=L.R[low].key;
    while(low<high)
    {
        while(low<high&&L.R[high].key>=pivotkey) --high;
        L.R[low]=L.R[high];
        while(low<high&&L.R[low].key<=pivotkey) ++low;
        L.R[high]=L.R[low];
    }
    L.R[low]=L.R[0];
    return low;
}

int QSort(SqList &L,int low,int high)
{
    if(low<high)
    {
       int pivotloc=Partition(L,low,high);
       QSort(L,low,pivotloc-1);
       QSort(L,pivotloc+1,high);
    }    
}

void QuickSort(SqList &L)
{
    QSort(L,1,L.length);
}

 


int main()
{
    SqList L;
    CreateList(L,8);
    cout<<"测试数据:"<<endl;
    ListTraverse(L);
    BubbleSort(L);
    cout<<"排序后:"<<endl;
    ListTraverse(L);
    cout<<"BubbleSort排序方法中数据的比较次数为:"<<CmpNum0<<endl;
  InsertSort(L);
    cout<<"排序后:"<<endl;
    ListTraverse(L);
    cout<<"InsertSort排序方法中数据的比较次数为:"<<CmpNum1<<endl;
    BInsertSort(L);
    cout<<"排序后:"<<endl;
    ListTraverse(L);
    cout<<"BInsertSort排序方法中数据的比较次数为:"<<CmpNum2<<endl;
    QuickSort(L);
    cout<<"排序后:"<<endl;
    ListTraverse(L);
    return 0;
}

posted @ 2015-11-17 21:46  IT_程序袁  阅读(394)  评论(0编辑  收藏  举报