選擇排序

鏈表選擇排序

#include<iostream>
using namespace std;

typedef struct LNode                                        //定義單鏈表
{
    int data;
    struct LNode *next;
}LNode,*LinkList;

void InitList_L(LinkList &L)                                //建立單鏈表
{
    L=new LNode;
    L->next=NULL;
}

void input(LinkList &L,int n)                               //依次往單鏈表L裏輸入數據
{
    int i;
    LinkList p,r;
    r=L;
    cout<<"請輸入該表的元素:";
    for(i=0;i<n;i++)
    {
        p=new LNode;
        cin>>p->data;
        p->next=NULL;
        r->next=p;
        r=p;
    }
}

void output(LinkList L)                                     //依次輸出單鏈表裏的每一個元素
{
    int i=0;
    LNode *p;
    p=L->next;
    while(p)
    {
        if(i)
            cout<<",";
        cout<<p->data;
        p=p->next;
        i=1;
    }
}

// void LinkedListSelectSort(LinkList head)
//  //本算法一趟找出一個關鍵字最小的結點,其數據和當前結點進行交換;若要交換指針,
//  //則須記下當前結點和最小結點的前驅指針
// {LinkList r,q,p=head->next;
//   int t;
//   while(p!=NULL)
//     {q=p->next;  r=p;    //設r是指向關鍵字最小的結點的指針
//      while (q!=NULL)
//       {if(q->data<r->data)  _____________;
//       _________;
//   }
//      if(r!=p) { t=r->data;r->data=p->data;p->data=t;}
//     ____________;
//   }
//
// }



void LinkedListSelectSort(LinkList head){
    LinkList save,r,p,q,s; //list指向頭結點
        save = head;
        while(save->next){
                q = save->next;
                r=q;
                p=q->next;
                while(p){
                    if (p->data < q->data) //尋找值最小結點與其前驅結點
                    {
                        s = r;
                        q=p;
                    }
                    r = p;
                    p=p->next;
                }
                if (q!=save->next) //若最小結點不是第一個未排序結點
                {
                    s->next = q->next;
                    q->next = save->next;
                    save->next = q;
                } //將最小結點與前面一個鏈結點交換位置
                save = q;
        }
}
int main()
{
    LinkList L;
    int num;

    cout<<"請輸入單鏈表元素個數n:";
    cin>>num;
    InitList_L(L);                                                  //La表的建立
    input(L,num);                                               //依次往單鏈表La裏輸入數據


    LinkedListSelectSort(L);                                            //將單鏈表La和Lb進行合併


    cout<<"排序後:\n";         //輸出合併後的單鏈表Lc
    output(L);
    cout<<endl;
    return 0;
}

基本選擇排序

//算法8.5 快速排序
#include <iostream>
using namespace std;
#define  MAXSIZE  20                    //順序表的最大長度
typedef struct
{
    int key;
    char *otherinfo;
}ElemType;
//順序表的存儲結構                         
typedef struct
{
    ElemType *r;                                    //存儲空間的基地址
    int  length;                                    //順序表長度
}SqList;                                            //順序表類型


int Partition(SqList &L,int low,int high)
{ 
    //對順序表L中的子表r[low..high]進行一趟排序,返回樞軸位置
    int pivotkey;
    L.r[0]=L.r[low];                        //用子表的第一個記錄作樞軸記錄
    pivotkey=L.r[low].key;                  //樞軸記錄關鍵字保存在pivotkey中
    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];                 //將比樞軸記錄大的記錄移到高端
    }//while
    L.r[low]=L.r[0];                        //樞軸記錄到位
    return  low;                            //返回樞軸位置
}//Partition

void QSort(SqList &L,int low,int high)
{   //調用前置初值:low=1; high=L.length;
    //對順序表L中的子序列L.r[low..high]作快速排序
    int pivotloc;
    if(low<high)
    {                                       //長度大於1
       pivotloc=Partition(L,low,high);      //將L.r[low..high]一分爲二,pivotloc是樞軸位置
       QSort(L,low,pivotloc-1);             //對左子表遞歸排序
       QSort(L,pivotloc+1,high);            //對右子表遞歸排序
    }
}                                           //QSort

void QuickSort(SqList &L)
{
   //對順序表L作快速排序
   QSort(L,1,L.length);
}                                           //QuickSort
                                
void Create_Sq(SqList &L)
{
    int i,n;
    cout<<"請輸入數據個數,不超過"<<MAXSIZE<<"個。"<<endl;
    cin>>n;                                         //輸入個數
    cout<<"請輸入待排序的數據:\n";
    while(n>MAXSIZE)
    {
        cout<<"個數超過上限,不能超過"<<MAXSIZE<<",請從新輸入"<<endl;
        cin>>n;
    }
    for(i=1;i<=n;i++)
    {
        cin>>L.r[i].key;
        L.length++;
    }
}


void show(SqList L)
{
    int i;
    for(i=1;i<=L.length;i++)
        cout<<L.r[i].key<<endl;
}


void main()
{
    SqList L;
    L.r=new ElemType[MAXSIZE+1];
    L.length=0;
    Create_Sq(L);
    QuickSort(L);
    cout<<"排序後的結果爲:"<<endl;
    show(L);
}
相關文章
相關標籤/搜索