数据结构 实验14~15 基本排序算法实现

实验目的:熟悉常用基本排序算法及其特点和效率。

实验要求:实现基本排序算法,并对待排序的数据进行排序。

实验内容

假设待排序数据是整型。编写程序,实现以下功能:

(1)实现选择排序(直接选择排序)、插入排序(直接插入排序)和交换排序(快速排序、冒泡排序)、*归并排序等各种排序方法

#include <iostream>
#include <cmath>
using namespace std;

class Sort
{
public:
    Sort(int r[ ], int n);                         //构造函数,生成待排序序列
    ~Sort( );                                   //析构函数
    void SelectSort( );                            //简单选择排序
    void InsertSort( );                            //直接插入排序
    void QuickSort(int first, int last);             //快速排序
    void BubbleSort( );                           //冒泡排序
    void ShellSort( );                            //希尔排序
    void HeapSort( );                             //堆排序
    void MergeSort1(int first, int last);            //二路归并(递归)排序
    void MergeSort2( );                           //二路归并(非递归)排序
    void Print( );                                //输出序列
private:
    int Partition(int first, int last);                //快速排序,一次划分
    void Sift(int k, int last);                        //堆排序,堆调整
    void Merge(int first1, int last1, int last2);       //归并排序,合并相邻有序序列
    void MergePass(int h);                        //归并排序,一趟归并

    int *data;                                  //待排序序列
    int length;
};

Sort :: Sort(int r[ ], int n)
{
    data = new int[n];
    for (int i = 0; i < n; i++)
        data[i] = r[i];
    length = n;
}

Sort :: ~Sort( )
{
    delete[ ] data;
}

void Sort :: InsertSort( )   //直接插入排序
{
    int i, j, temp;
    for (i = 1; i < length; i++)                      //排序进行length-1趟
    {
        temp = data[i];                                //暂存待插记录
        for (j = i - 1; j >= 0 && temp < data[j]; j--)     //寻找插入位置
            data[j + 1] = data[j];
        data[j + 1] = temp;
    }
}

void Sort :: SelectSort( )    //选择排序
{
    int i, j, index, temp;
    for (i = 0; i < length - 1; i++)  	        //进行length-1趟简单选择排序
    {
        index = i;
        for (j = i + 1; j < length; j++)         //在无序区中选取最小记录
            if (data[j] < data[index])
                index = j;
        if (index != i)
        {
            temp = data[i];
            data[i] = data[index];
            data[index] = temp;
        }
    }
}

int Sort :: Partition(int first, int last)   //快速排序一次划分算法
{
    int i = first, j = last, temp;              //初始化一次划分的区间
    while (i < j)
    {
        while (i < j && data[i] <= data[j])
            j--;      //右侧扫描
        if (i < j)
        {
            temp = data[i];
            data[i] = data[j];
            data[j] = temp;
            i++;
        }
        while (i < j && data[i] <= data[j])
            i++;     //左侧扫描
        if (i < j)
        {
            temp = data[i];
            data[i] = data[j];
            data[j] = temp;
            j--;
        }
    }
    return i;                           // i为轴值记录的最终位置
}

void Sort :: QuickSort(int first, int last)  //快速排序
{
    if (first >= last)
        return;                            //区间长度为1,递归结束
    else
    {
        int pivot = Partition(first, last);     //一次划分
        QuickSort(first, pivot - 1);       //对左侧子序列进行快速排序
        QuickSort(pivot + 1, last);       //对右侧子序列进行快速排序
    }
}

void Sort :: BubbleSort( )    //冒泡排序
{
    int j, exchange, bound, temp;
    exchange = length - 1;           //第一趟冒泡排序的区间是[0~length-1]
    while (exchange != 0)
    {
        bound = exchange;
        exchange = 0;
        for (j = 0; j < bound; j++)       //一趟冒泡排序的区间是[0~bound]
            if (data[j] > data[j + 1])
            {
                temp = data[j];
                data[j] = data[j + 1];
                data[j + 1] = temp;
                exchange = j;           //记载每一次记录交换的位置
            }
    }
}

void Sort :: ShellSort( )   //希尔排序
{
    int temp, d, i, j;
    for (d = length / 2; d >= 1; d = d / 2)     //增量为d进行直接插入排序
    {
        for (i = d; i < length; i++)               //进行一趟希尔排序
        {
            temp = data[i];                    //暂存待插入记录
            for (j = i - d; j >= 0 && temp < data[j]; j = j - d)
                data[j + d] = data[j];                //记录后移d个位置
            data[j + d] = temp;
        }
    }
}

void Sort :: Sift(int k, int last)   //堆排序,堆调整
{
    int i, j, temp;
    i = k;
    j = 2 * i + 1;               // i是被筛选结点,j是i的左孩子
    while (j <= last)                  //筛选还没有进行到叶子
    {
        if (j < last && data[j] < data[j + 1])
            j++;     // j指向左右孩子的较大者
        if (data[i] > data[j])
            break;               //已经是堆
        else
        {
            temp = data[i];
            data[i] = data[j];
            data[j] = temp;
            i = j;
            j = 2 * i + 1;                //被筛结点位于原来结点j的位置
        }
    }
}

void Sort :: HeapSort( )   //堆排序
{
    int i, temp;
    for (i = ceil(length / 2) - 1; i >= 0; i--)     //从最后一个分支结点至根结点
        Sift(i, length - 1) ;
    for (i = 1; i < length; i++)
    {
        temp = data[0];
        data[0] = data[length - i];
        data[length - i] = temp;
        Sift(0, length - i - 1);                      //重建堆
    }
}

void Sort :: Merge(int first1, int last1, int last2)   //归并排序,合并相邻有序序列
{
    int *temp = new int[length];           //数组temp作为合并的辅助空间
    int i = first1, j = last1 + 1, k = first1;
    while (i <= last1 && j <= last2)
    {
        if (data[i] <= data[j])
            temp[k++] = data[i++];    //取较小者放入temp[k]
        else
            temp[k++] = data[j++];
    }
    while (i <= last1)                  //对第一个子序列进行收尾处理
        temp[k++] = data[i++];
    while (j <= last2)                  //对第二个子序列进行收尾处理
        temp[k++] = data[j++];
    for (i = first1; i <= last2; i++)         //将合并结果传回数组r
        data[i] = temp[i];
    delete[ ] temp;
}

void Sort :: MergeSort1(int first, int last)  //二路归并排序 (递归)
{
    if (first == last)
        return;        //待排序序列只有1个记录,递归结束
    else
    {
        int mid = (first + last) / 2;
        MergeSort1(first, mid);          //归并排序前半个子序列
        MergeSort1(mid + 1, last);      //归并排序后半个子序列
        Merge(first, mid, last);            //将两个已排序的子序列合并
    }
}

void Sort :: MergePass(int h)   //一趟归并排序
{
    int i = 0;
    while (i + 2 * h <= length)           //待归并记录有两个长度为h的子序列
    {
        Merge(i, i + h - 1, i + 2 * h - 1);
        i = i + 2 * h;
    }
    if (i + h < length)
        Merge(i, i + h - 1, length - 1); //两个子序列一个长度小于h
}

void Sort :: MergeSort2( )   //二路归并排序非递归
{
    int h = 1;                            //初始时子序列长度为1
    while (h < length)
    {
        MergePass(h);                     //一趟归并排序
        h = 2 * h;
    }
}

void Sort :: Print( )   //遍历输出
{
    for (int i = 0; i < length; i++)
        cout << data[i] << " ";
    cout << endl;
}

int main( )
{
    int select, n;
    cout << "请输入待排序原数据的个数n:";
    cin >> n;
    cout << "请输入待排序的原数据:" << endl;
    int arr[n];
    for(int i = 0; i < n; i ++ )
        cin >> arr[i];
    cout << endl;
    Sort L(arr, n);
    cout << "*************\n";
    cout << "1. 简单选择排序        2. 直接插入排序" << endl;
    cout << "3. 快速排序            4. 冒泡排序" << endl;
    cout << "5. 希尔排序            6. 堆排序" << endl;
    cout << "7. 二路归并(递归)排序  8. 二路归并(非递归)排序" << endl;
    cout << "*************\n";
    cout << "请输入使用的排序技术编号:" ;
    cin >> select;
    cout << endl;
    switch (select)
    {
    case 1:
        cout << "简单选择排序后结果如下:" << endl;
        L.SelectSort( );  //简单选择排序
        break;
    case 2:
        cout << "直接插入排序后结果如下:" << endl;
        L.InsertSort( );  //直接插入排序
        break;
    case 3:
        cout << "快速排序后结果如下:" << endl;
        L.QuickSort(0, n - 1);  //快速排序
        break;
    case 4:
        cout << "冒泡排序后结果如下:" << endl;
        L.BubbleSort( );       //冒泡排序
        break;
    case 5:
        cout << "希尔排序后结果如下:" << endl;
        L.ShellSort( );  //希尔排序
        break;
    case 6:
        cout << "堆排序后结果如下:" << endl;
        L.HeapSort( );      //堆排序
        break;
    case 7:
        cout << "二路归并(递归)排序后结果如下:" << endl;
        L.MergeSort1(0, n - 1);  //二路归并(递归)排序
        break;
    case 8:
        cout << "二路归并(非递归)排序后结果如下:" << endl;
        L.MergeSort2( );   //二路归并(非递归)排序
        break;
    default :
        cout << "输入排序编号错误" << endl;
        break;
    }
    L.Print( );
    return 0;
}

(2)对于(1)实现的插入排序(直接插入排序)和交换排序(快速排序、冒泡排序),分别输出每一趟(遍)的结果和最终结果,并应用它对上面的数据序列进行排序。

#include <iostream>
using namespace std;

class Sort
{
public:
    Sort(int r[ ], int n);                         //构造函数,生成待排序序列
    ~Sort( );                                   //析构函数
    void InsertSort( );                            //直接插入排序
    void QuickSort(int first, int last);             //快速排序
    void BubbleSort( );                           //冒泡排序
private:
    int Partition(int first, int last);                //快速排序,一次划分

    int *data;                                  //待排序序列
    int length;
    int num1 = 0;
};

Sort :: Sort(int r[ ], int n)
{
    data = new int[n];
    for (int i = 0; i < n; i++)
        data[i] = r[i];
    length = n;
}

Sort :: ~Sort( )
{
    delete[ ] data;
}

void Sort :: InsertSort( )   //直接插入排序
{
    int i, j, temp;
    for (i = 1; i < length; i++)                      //排序进行length-1趟
    {
        temp = data[i];                                //暂存待插记录
        for (j = i - 1; j >= 0 && temp < data[j]; j--)     //寻找插入位置
            data[j + 1] = data[j];
        data[j + 1] = temp;
    cout << "第" << i << "趟排序结果如下:" << endl;
    for (int i = 0; i < length; i++)
        cout << data[i] << " ";
    cout << endl;
    }
}

int Sort :: Partition(int first, int last)   //快速排序一次划分算法
{
    int i = first, j = last, temp;              //初始化一次划分的区间
    while (i < j)
    {
        while (i < j && data[i] <= data[j])
            j--;      //右侧扫描
        if (i < j)
        {
            temp = data[i];
            data[i] = data[j];
            data[j] = temp;
            i++;
        }
        while (i < j && data[i] <= data[j])
            i++;     //左侧扫描
        if (i < j)
        {
            temp = data[i];
            data[i] = data[j];
            data[j] = temp;
            j--;
        }
    }
    cout << "第" << ++num1 << "趟排序结果如下:" << endl;
    for (int i = 0; i < length; i++)
        cout << data[i] << " ";
    cout << endl;
    return i;                           // i为轴值记录的最终位置
}

void Sort :: QuickSort(int first, int last)  //快速排序
{
    if (first >= last)
        return;                            //区间长度为1,递归结束
    else
    {
        int pivot = Partition(first, last);     //一次划分
        QuickSort(first, pivot - 1);       //对左侧子序列进行快速排序
        QuickSort(pivot + 1, last);       //对右侧子序列进行快速排序
    }
}

void Sort :: BubbleSort( )    //冒泡排序
{
    int j, exchange, bound, temp, num2 = 0;
    exchange = length - 1;           //第一趟冒泡排序的区间是[0~length-1]
    while (exchange != 0)
    {
        bound = exchange;
        exchange = 0;
        for (j = 0; j < bound; j++)       //一趟冒泡排序的区间是[0~bound]
            if (data[j] > data[j + 1])
            {
                temp = data[j];
                data[j] = data[j + 1];
                data[j + 1] = temp;
                exchange = j;           //记载每一次记录交换的位置
            }
        cout << "第" << ++num2 << "趟排序结果如下:" << endl;
        for (int i = 0; i < length; i++)
            cout << data[i] << " ";
        cout << endl;
    }
}

int main( )
{
    int select, n;
    cout << "请输入待排序原数据的个数n:";
    cin >> n;
    cout << "请输入待排序的原数据:" << endl;
    int arr[n];
    for(int i = 0; i < n; i ++ )
        cin >> arr[i];
    cout << endl;
    Sort L(arr, n);
    cout << "*************\n";
    cout << "1. 直接插入排序" << endl;
    cout << "2. 快速排序" << endl;
    cout << "3. 冒泡排序" << endl;
    cout << "*************\n";
    cout << "请输入使用的排序技术编号:" ;
    cin >> select;
    cout << endl;
    switch (select)
    {
    case 1:
        cout << "直接插入排序后结果如下:" << endl;
        L.InsertSort( );  //直接插入排序
        break;
    case 2:
        cout << "快速排序后结果如下:" << endl;
        L.QuickSort(0, n - 1);  //快速排序
        break;
    case 3:
        cout << "冒泡排序后结果如下:" << endl;
        L.BubbleSort( );       //冒泡排序
        break;
    default :
        cout << "输入排序编号错误" << endl;
        break;
    }
    return 0;
}

(3) 输入或给定若干个已经有序或逆序的线性表,分别利用选择排序(直接选择排序)、插入排序(直接插入排序)和交换排序(快速排序、冒泡排序)、*归并排序等各种排序方法对他们进行排序,并输出他们各自的比较和移动记录次数。检验实际结果(运行时间和比较、移动记录次数)和理论结果的差异,并进行讨论各种方法的优劣。

#include <iostream>
#include <cmath>
using namespace std;

class Sort
{
public:
    Sort(int r[ ], int n);                         //构造函数,生成待排序序列
    ~Sort( );                                   //析构函数
    void SelectSort( );                            //简单选择排序
    void InsertSort( );                            //直接插入排序
    void QuickSort(int first, int last);             //快速排序
    void BubbleSort( );                           //冒泡排序
    void ShellSort( );                            //希尔排序
    void HeapSort( );                             //堆排序
    void MergeSort1(int first, int last);            //二路归并(递归)排序
    void MergeSort2( );                           //二路归并(非递归)排序
    void Print( );                                //输出序列
private:
    int Partition(int first, int last);                //快速排序,一次划分
    void Sift(int k, int last);                        //堆排序,堆调整
    void Merge(int first1, int last1, int last2);       //归并排序,合并相邻有序序列
    void MergePass(int h);                        //归并排序,一趟归并

    int *data;                                  //待排序序列
    int length;
    int bijiao_kuaisu = 0;       //快速排序的比较记录次数
    int mv_kuaisu = 0;       //快速排序的移动记录次数
    int bijiao_dui = 0;       //堆排序的比较记录次数
    int mv_dui = 0;       //堆排序的移动记录次数
    int bijiao_guibing = 0; //归并排序的比较记录次数
    int mv_guibing = 0; //归并排序的移动记录次数
};

Sort :: Sort(int r[ ], int n)
{
    data = new int[n];
    for (int i = 0; i < n; i++)
        data[i] = r[i];
    length = n;
}

Sort :: ~Sort( )
{
    delete[ ] data;
}

void Sort :: SelectSort( )    //选择排序
{
    int i, j, index, temp, bijiao = 0, mv = 0;
    for (i = 0; i < length - 1; i++)  	        //进行length-1趟简单选择排序
    {
        index = i;
        for (j = i + 1; j < length; j++)         //在无序区中选取最小记录
            bijiao++;
            if (data[j] < data[index])
                index = j;
                mv++;
        if (index != i)
        {
            temp = data[i];
            data[i] = data[index];
            data[index] = temp;
            mv++;
        }
    }
    cout << "比较次数:" << bijiao <<endl;
    cout << "移动次数:" << mv <<endl;
}

void Sort :: InsertSort( )   //直接插入排序
{
    int i, j, temp, bijiao = 0, mv = 0;
    for (i = 1; i < length; i++)                      //排序进行length-1趟
    {
        temp = data[i];                                //暂存待插记录
        bijiao++;
        for (j = i - 1; j >= 0 && temp < data[j]; j--)     //寻找插入位置
        {
            bijiao++;
            data[j + 1] = data[j];
        }
        data[j + 1] = temp;
        mv++;
    }
    cout << "比较次数:" << bijiao <<endl;
    cout << "移动次数:" << mv <<endl;
}

int Sort :: Partition(int first, int last)   //快速排序一次划分算法
{
    int i = first, j = last, temp;              //初始化一次划分的区间
    while (i < j)
    {
        while (i < j && data[i] <= data[j])
            bijiao_kuaisu++;
            j--;      //右侧扫描
        if (i < j)
        {
            temp = data[i];
            data[i] = data[j];
            data[j] = temp;
            i++;
            mv_kuaisu++;
        }
        while (i < j && data[i] <= data[j])
            bijiao_kuaisu++;
            i++;     //左侧扫描
        if (i < j)
        {
            temp = data[i];
            data[i] = data[j];
            data[j] = temp;
            j--;
            mv_kuaisu++;
        }
    }
    return i;                           // i为轴值记录的最终位置
}

void Sort :: QuickSort(int first, int last)  //快速排序
{
    if (first >= last)
        return;                            //区间长度为1,递归结束
    else
    {
        int pivot = Partition(first, last);     //一次划分
        QuickSort(first, pivot - 1);       //对左侧子序列进行快速排序
        QuickSort(pivot + 1, last);       //对右侧子序列进行快速排序
    }
    cout << "比较次数:" << bijiao_kuaisu <<endl;
    cout << "移动次数:" << mv_kuaisu <<endl;
}

void Sort :: BubbleSort( )    //冒泡排序
{
    int j, exchange, bound, temp, bijiao = 0, mv = 0;
    exchange = length - 1;           //第一趟冒泡排序的区间是[0~length-1]
    while (exchange != 0)
    {
        bound = exchange;
        exchange = 0;
        for (j = 0; j < bound; j++)       //一趟冒泡排序的区间是[0~bound]
            bijiao++;
            if (data[j] > data[j + 1])
            {
                temp = data[j];
                data[j] = data[j + 1];
                data[j + 1] = temp;
                exchange = j;           //记载每一次记录交换的位置
                mv++;
            }
    }
    cout << "比较次数:" << bijiao <<endl;
    cout << "移动次数:" << mv <<endl;
}

void Sort :: ShellSort( )   //希尔排序
{
    int temp, d, i, j, bijiao = 0, mv = 0;
    for (d = length / 2; d >= 1; d = d / 2)     //增量为d进行直接插入排序
    {
        for (i = d; i < length; i++)               //进行一趟希尔排序
        {
            bijiao++;
            temp = data[i];                    //暂存待插入记录
            for (j = i - d; j >= 0 && temp < data[j]; j = j - d)
                data[j + d] = data[j];                //记录后移d个位置
                mv++;
            data[j + d] = temp;
        }
    }
    cout << "比较次数:" << bijiao <<endl;
    cout << "移动次数:" << mv <<endl;
}

void Sort :: Sift(int k, int last)   //堆排序,堆调整
{
    int i, j, temp;
    i = k;
    j = 2 * i + 1;               // i是被筛选结点,j是i的左孩子
    while (j <= last)             //筛选还没有进行到叶子
    {
        bijiao_dui++;
        if (j < last && data[j] < data[j + 1])
            j++;     // j指向左右孩子的较大者
        if (data[i] > data[j])
            break;               //已经是堆
        else
        {
            temp = data[i];
            data[i] = data[j];
            data[j] = temp;
            i = j;
            j = 2 * i + 1;                //被筛结点位于原来结点j的位置
            mv_dui++;
        }
    }
}

void Sort :: HeapSort( )   //堆排序
{
    int i, temp;
    for (i = ceil(length / 2) - 1; i >= 0; i--)     //从最后一个分支结点至根结点
        Sift(i, length - 1) ;
    for (i = 1; i < length; i++)
    {
        temp = data[0];
        data[0] = data[length - i];
        data[length - i] = temp;
        Sift(0, length - i - 1);                      //重建堆
    }
    cout << "比较次数:" << bijiao_dui << endl;
    cout << "移动次数:" << mv_dui << endl;
}

void Sort :: Merge(int first1, int last1, int last2)   //归并排序,合并相邻有序序列
{
    int *temp = new int[length];           //数组temp作为合并的辅助空间
    int i = first1, j = last1 + 1, k = first1;
    while (i <= last1 && j <= last2)
    {
        bijiao_guibing++;
        if (data[i] <= data[j])
            temp[k++] = data[i++];    //取较小者放入temp[k]
        else
            temp[k++] = data[j++];
    }
    while (i <= last1)                  //对第一个子序列进行收尾处理
        temp[k++] = data[i++];
    while (j <= last2)                  //对第二个子序列进行收尾处理
        temp[k++] = data[j++];
    for (i = first1; i <= last2; i++)         //将合并结果传回数组r
        data[i] = temp[i];
        mv_guibing++;
    delete[ ] temp;
}

void Sort :: MergeSort1(int first, int last)  //二路归并排序 (递归)
{
    if (first == last)
        return;        //待排序序列只有1个记录,递归结束
    else
    {
        int mid = (first + last) / 2;
        MergeSort1(first, mid);         //归并排序前半个子序列
        MergeSort1(mid + 1, last);      //归并排序后半个子序列
        Merge(first, mid, last);        //将两个已排序的子序列合并
    }
    cout << "比较次数:" << bijiao_guibing << endl;
    cout << "移动次数:" << mv_guibing << endl;
}

void Sort :: MergePass(int h)   //一趟归并排序
{
    int i = 0;
    while (i + 2 * h <= length)           //待归并记录有两个长度为h的子序列
    {
        Merge(i, i + h - 1, i + 2 * h - 1);
        i = i + 2 * h;
    }
    if (i + h < length)
        Merge(i, i + h - 1, length - 1); //两个子序列一个长度小于h
}

void Sort :: MergeSort2( )   //二路归并排序非递归
{
    int h = 1;                            //初始时子序列长度为1
    while (h < length)
    {
        MergePass(h);                     //一趟归并排序
        h = 2 * h;
    }
    cout << "比较次数:" << bijiao_guibing << endl;
    cout << "移动次数:" << mv_guibing << endl;
}

void Sort :: Print( )   //遍历输出
{
    for (int i = 0; i < length; i++)
        cout << data[i] << " ";
    cout << endl;
}

int main( )
{
    int select, n;
    cout << "请输入已经有序或逆序的线性表原数据的个数n:";
    cin >> n;
    cout << "输入若干个已经有序或逆序的线性表原数据:" << endl;
    int arr[n];
    for(int i = 0; i < n; i ++ )
        cin >> arr[i];
    cout << endl;
    Sort L(arr, n);
    cout << "*************\n";
    cout << "1. 简单选择排序        2. 直接插入排序" << endl;
    cout << "3. 快速排序            4. 冒泡排序" << endl;
    cout << "5. 希尔排序            6. 堆排序" << endl;
    cout << "7. 二路归并(递归)排序  8. 二路归并(非递归)排序" << endl;
    cout << "*************\n";
    cout << "请输入使用的排序技术编号:" ;
    cin >> select;
    cout << endl;
    switch (select)
    {
    case 1:
        cout << "简单选择排序结果如下:" << endl;
        L.SelectSort( );  //简单选择排序
        break;
    case 2:
        cout << "直接插入排序结果如下:" << endl;
        L.InsertSort( );  //直接插入排序
        break;
    case 3:
        cout << "快速排序结果如下:" << endl;
        L.QuickSort(0, n - 1);  //快速排序
        break;
    case 4:
        cout << "冒泡排序结果如下:" << endl;
        L.BubbleSort( );       //冒泡排序
        break;
    case 5:
        cout << "希尔排序结果如下:" << endl;
        L.ShellSort( );  //希尔排序
        break;
    case 6:
        cout << "堆排序结果如下:" << endl;
        L.HeapSort( );      //堆排序
        break;
    case 7:
        cout << "二路归并(递归)排序结果如下:" << endl;
        L.MergeSort1(0, n - 1);  //二路归并(递归)排序
        break;
    case 8:
        cout << "二路归并(非递归)排序结果如下:" << endl;
        L.MergeSort2( );   //二路归并(非递归)排序
        break;
    default :
        cout << "输入排序编号错误" << endl;
        break;
    }
    L.Print( );
    return 0;
}

(4)* 证明快速排序算法是不稳定的。

#include <iostream>
using namespace std;

class Sort
{
public:
    Sort(int r[ ], int n);                      //构造函数,生成待排序序列
    ~Sort( );                                   //析构函数
    void QuickSort(int first, int last);        //快速排序
private:
    int Partition(int first, int last);         //快速排序,一次划分

    int *data;                                  //待排序序列
    int length;
    int tang = 0;  //快速排序的趟数
};

Sort :: Sort(int r[ ], int n)
{
    data = new int[n];
    for (int i = 0; i < n; i++)
        data[i] = r[i];
    length = n;
}

Sort :: ~Sort( )
{
    delete[ ] data;
}

int Sort :: Partition(int first, int last)   //快速排序一次划分算法
{
    cout << "第" << ++tang << "趟排序结果如下:" << endl;
    int i = first, j = last, temp;           //初始化一次划分的区间
    while (i < j)
    {
        while (i < j && data[i] <= data[j])
            j--;      //右侧扫描
        if (i < j)
        {
            cout << "被交换元素:" << data[i] << ",交换元素:" << data[j] << endl;
            temp = data[i];
            data[i] = data[j];
            data[j] = temp;
            i++;
        }
        while (i < j && data[i] <= data[j])
            i++;     //左侧扫描
        if (i < j)
        {
            cout << "被交换元素:" << data[j] << ",交换元素:" << data[i] << endl;
            temp = data[i];
            data[i] = data[j];
            data[j] = temp;
            j--;
        }
    }
    for (int i = 0; i < length; i++)
        cout << data[i] << " ";
    cout << endl;
    return i;                                // i为轴值记录的最终位置
}

void Sort :: QuickSort(int first, int last)  //快速排序
{
    if (first >= last)
        return;                              //区间长度为1,递归结束
    else
    {
        int pivot = Partition(first, last);  //一次划分
        QuickSort(first, pivot - 1);         //对左侧子序列进行快速排序
        QuickSort(pivot + 1, last);          //对右侧子序列进行快速排序
    }
}

int main( )
{
    int n;
    cout << "请输入待排序原数据的个数n:";
    cin >> n;
    cout << "请输入待排序的原数据:" << endl;
    int arr[n];
    for(int i = 0; i < n; i ++ )
        cin >> arr[i];
    cout << endl;
    Sort L(arr, n);
    cout << "*************\n";
    cout << "*************\n";
    cout << "快速排序结果如下:" << endl;
    L.QuickSort(0, n - 1);  //快速排序
    return 0;
}

 (5) * 随机产生100,200,500,1000,2000等若干个随机整数,并将他们存到一个线性表中,再实现(3)的要求。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

再见以前说再见

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值