• 典例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

                    }

           }

    }

  • 相关阅读:
    Linux C++ 处理 Kill 信号、Ctrl+C信号,便于安全退出
    静态链接libcurl的步骤
    编译器如何C++的函数重载
    单链表逆序 也叫反转
    VC 创建拨号连接A
    强大的vim配置,让编程更随意
    已知二叉树后序遍历序列是DBCEFGHA,中序遍历序列EDCBAHFG,它的前序遍历的序列是?麻烦再画下这二叉树.
    怎样使用IPV6编程
    全面详细介绍libcurl的使用
    ZeroMQ全面介绍
  • 原文地址:https://www.cnblogs.com/shihao/p/1540711.html
Copyright © 2020-2023  润新知