典例20:排序算法

 

编写一程序要求能够实现直接插入排序、希尔排序、简单选择排序、冒泡排序和快速排序,并用测试函数对其进行测试。

算法设计:根据题目要求,设计5个排序函数,实现各种排序功能。

1 直接插入排序函数InsSort():设计思想,首先令排序表中的第1个记录有序,然后将第2个记录插入到有序表中合适位置,有序表就增加到了两个元素。再将第3个记录插入到有序表中的合适位置,依此类推,直到表中元素全部有序。

2 希尔排序函数ShellSort():设计思想,取一个整数d将全部记录n分为d个子序列,将所有距离为d的记录放在同一个子序列中;在每个子序列内分别施行直接插入排序;然后缩小间隔d,重复上述子序列划分和排序,直到最后取 d = = 1,将所有记录放在同一个序列中排序为止。

3 简单选择排序函数SelectSort():首先在所有的记录中选出关键字最小的记录,把它与第一个记录交换,然后在其余的记录中再选出关键字最小的记录,与第二个记录交换,依次类推,直到所有记录排序完成。

4)冒泡排序函数BubbleSort():设计思想如15.2.3所述。

5)快速排序函数QuickSortint lowint high):设计思想如15.2.3节所述。

算法实现:

#includeiostream.h

#define MaxSize 100

typedef int DataType

class SeqList

{

          DataType list[MaxSize]

          int length

public

          SeqList(){length = 0}

          void SLCreatint n);//创建顺序表

           void InsSort();    //直接插入排序

       void ShellSort();   //希尔排序

          void SelectSort();  //简单选择排序

          void BubbleSort(); //冒泡排序

          void QuickSort();  //快速排序

          void QuickSortint lowint high);//快速排序

          int partitionint iint j);

          void SLPrint();    //将顺序表显示在屏幕上

}

//创建顺序表

void SeqList::SLCreatint n);

{

        DataType x

        length = 0

        cout <<“请输入数据元素值:”;

        forint i = 0i < ni++

         {

               cin >> x

               list[i] = x

               length++

         }

}

//直接插入排序

void SeqList::InsSort()

{

        SLCreat5);

        DataType x

        int ij

        fori = 0i < lengthi++

         {

               x = list[i]

               forj = i-1j >= 0j--

                    ifx < list[j]

                           list[j+1] = list[j]

                    else

                           break

                    list[j+1] = x

         }

        cout <<“直接插入排序结果:”;

     SLPrint();

}

//希尔排序

void SeqList::ShellSort()

{

        SLCreat5);

        DataType x

        int Ijdn

        n = length

        ford = n/2d >= 1d/= 2

          {    //按不同分量进行排序

                fori = di < ni++

                 {   //list[i]元素直接插入到对应分组的有序表中

                       x = list[i]

                       forj = I-dj >= 0j-= d

                        {

                              ifx < list[j]

                                    list [j+d] = list[j]

                          else

                                break

                        }

                      list[j+d] = x

                }

          }

         cout <<“希尔排序结果:”;

         SLPrint();

}

//简单选择排序

void SeqList::SelectSort()

{

        SLCreat5);

        DataType x

        int ijk

        fori = 0i < lengthI++

         {

               k = i//用保存当前得到的最小排序码元素的下标,初值为I

               forj = i+1j < lengthj++

                {   //从当前排序区间中顺序查找出具有最小排序码的元素list[k]

                      iflist[j]<list[k]

                           k = j

                }

               ifk!=I

                {   //list[k]对调到该排序区间的第一个位置

                      x = list[i]

                      list[i] = list[k]

                      list[k] = x

                }

} 

        cout <<“简单选择排序结果:”;

        SLPrint();

}

//冒泡排序

void SeqList::BubbleSort()

{

        SLCreat5);

        DataType x

        int ijflag

        fori = 1i < length-1iI++

         {

               flag = 0

               forj = length-1j >= ij--

                    iflist[j] < list[j-1]

                      {

                             x = list[j-1]

                         list[j-1] = list[j]

                         list[j] = x

                             flag = 1

                     }

               ifflag == 0return

        }

       cout <<“冒泡排序结果:”;

       SLPrint();

}

//快速排序

void SeqList::QuickSort()

{

        SLCreat5);

        QuickSort04);

        cout <<“快速排序结果:”;

        SLPrint();

}

//快速排序

void SeqList::QuickSortint lowint high

{

        int pos

        iflow < high

         {

               pos = partitionlowhigh);

               QuickSortlowpos-1);

               QuickSortpos+1high);

        }

}

int SeqList::partitionint Iint j

{

        DataType pivotkey

        pivotkey = list[i]

        whilei < j

         {

               whilei < j&&list[j] >= pivotkey --j

               ifi < jlist[i++] = list[j]

               whilei < j&&list[i] <= pivotkey ++i

               ifi < jlist[j--] = list[i]

        }

       list[i] = pivotkey

       return i

}

//将顺序表显示在屏幕上

void SeqList::SLPrint()

{

        forint i = 0i < lengthi++

               cout << list[i] <<“”;

        cout << endl

}

void main()

{

     SeqList myList1myList2myList3myList4myList5

        int chflag = 1

        whileflag

         {

               cout << endl

               cout <<1.  直接插入排序\n”;

               cout <<2.  希尔排序\n”;

               cout <<3.  简单选择排序\n”;

               cout <<4.  冒泡排序\n”;

               cout <<5.  快速排序\n”;

               cout <<6.  退出\n”;

               cout <<“请选择(1-6):”;

               cin >> ch

               switchch

                 {

                   case 1  myList1.InsSort();break

                   case 2  myList2.ShellSort();break

                   case 3  myList3.SelectSort();break

                   case 4 myList4.BubbleSort();break

                   case 5 myList5.QuickSort();break

                   case 6 flag = 0break

                }

       }

}

原文地址:https://www.cnblogs.com/shihao/p/1540711.html