1. 程式人生 > >排序之選擇類排序

排序之選擇類排序

1.簡單選擇排序

//簡單選擇排序

    void SelectSort(int R[],int n)

    {

        int i,j,cur;

        for(i=1;i<=n;i++){

            cur=i;

            for(j=i+1;j<=n;j++){

                if(R[j]<R[cur])

                    cur=j;

            }

            swap(R[i],R[cur]);

        }

    }

 

2.堆排序


  


  //對以i作為根的樹進行調整,只能保證i調整路徑上的節點大小有序

    void Sift(int R[],int low,int high)

    {

        int i=low,j=2*low;

        while(j<high)

        {

            //j<high目的j+1<=high,鎖定其較大的孩子進行交換

            if(j<high&&R[j]<R[j+1])

                j++;

            //如果當前節點小於子節點

            if(R[i]<R[j])

            {

                swap(R[i],R[j]);//將父節點與比他大的孩子進行交換

                i=j;//父節點到了孩子的地方,i隨之變化

                j=2*i;//j表示新的左孩子節點

            }else//如果目節點大於最大的孩子,則結束

                break;

        }

    }

    //堆排序

    void HeapSort(int R[],int n)

    {

         //建立初始堆

         for(int i=n/2;i>=1;i--)

             Sift(R,i,n);

        for(int i=n;i>=2;i--)

        {

            //將堆的最大值置尾

            swap(R[i],R[1]);

            //對堆進行調整,並縮減堆的規模

            Sift(R,1,i-1);

        }

    }