【數據結構】6-1內部排序(選擇、插入、快排)

dataList類定義:

class dataList {
private:
    int number;
    int *data, *bdata;//data數組是隨機生成的,排序更改的都是這個數組,bdata就是用來存放排序前的
    void reset();//重置數組爲初始生成的亂序狀態
public:
    dataList(int num);
    void Select_sort();
    void Insert_sort();
    void Qick_sort(int start, int end);
    void print(int kind);
};

構造函數

dataList::dataList(int num)
{
    data = new int[num];
    bdata = new int[num];
    number = num;
    for (int i = 0; i < number; i++)
    {
        data[i] = rand() % 100;
        bdata[i] = data[i];
    }
}

選擇排序

void dataList::Select_sort()//最簡單的選擇排序
{
    for (int i = 0; i < number; i++)
    {
        for (int j = i; j < number; j++)
        {
            if (data[i] > data[j])
            {
                int temp = data[j];
                data[j] = data[i];
                data[i] = temp;
            }
        }
    }
}

插入排序

void dataList::Insert_sort()
{
    for (int i = 0; i <number; ++i) 
    {
        for (int j = i; j > 0; --j)
        {
            if (data[j] < data[j - 1]) 
            {
                int temp = data[j];
                data[j] = data[j - 1];
                data[j - 1] = temp;
            }
        }
    }
}

快速排序

void dataList::Qick_sort(int start, int end)
{
    int i = start;
    int j = end;
    int temp = data[i];
    if (i < j)
    {
        while (i < j)
        {

            while (i < j &&  data[j] >= temp)
                j--;
            if (i < j)
            {
                data[i] = data[j];
                i++;
            }
            while (i < j && temp > data[i])
                i++;
            if (i < j)
            {
                data[j] = data[i];
                j--;
            }
        }
        data[i] = temp;
        Qick_sort(start, i - 1);
        Qick_sort(i + 1, end);
    }
    
}

菜單

void menu()//模擬菜單選項
{
    cout << "---------------------排序小程序[email protected]" << endl;
    cout << "|                                                      |" << endl;
    cout << "|       1____________簡單選擇排序                        |" << endl;
    cout << "|       2____________直接插入排序                        |" << endl;
    cout << "|       3____________快速排序                            |" << endl;
    cout << "|       4____________退出系統                            |" << endl;
    cout << "|                                                       |" << endl;
    cout << "---------------------------------------------------------" << endl;
}

額,複製過來格式就亂了,自己對齊吧

測試函數

int main()
{
    srand(time(NULL));
    dataList L(maxsize);
    menu();
    while (1)
    {
        int select;
        cout << "請輸入您的選擇:";
        cin >> select;
        switch (select)
        {
        case 1://簡單選擇排序
        {    
            L.Select_sort();
            L.print(select);
            break;
        }
        case 2://直接插入排序
            L.Insert_sort();
            L.print(select);
            break;
        case 3://快速排序
            L.Qick_sort(0,maxsize-1);
            L.print(select);
            break;
        case 4:
            system("pause");
            return 0;
        default:
            cout << "您輸入的選項有誤,請重新輸入:";
        }
    }

}

完整代碼

 

#include<iostream>
#include<ctime>
const int maxsize = 10;
using namespace std;
class dataList {
private:
    int number;
    int *data, *bdata;//data數組是隨機生成的,排序更改的都是這個數組,bdata就是用來存放排序前的
    void reset();//重置數組爲初始生成的亂序狀態
public:
    dataList(int num);
    void Select_sort();
    void Insert_sort();
    void Qick_sort(int start, int end);
    void print(int kind);
};
dataList::dataList(int num)
{
    data = new int[num];
    bdata = new int[num];
    number = num;
    for (int i = 0; i < number; i++)
    {
        data[i] = rand() % 100;
        bdata[i] = data[i];
    }
}
void dataList::Select_sort()//最簡單的選擇排序
{
    for (int i = 0; i < number; i++)
    {
        for (int j = i; j < number; j++)
        {
            if (data[i] > data[j])
            {
                int temp = data[j];
                data[j] = data[i];
                data[i] = temp;
            }
        }
    }
}
void dataList::reset()
{
    for (int i = 0; i < number; i++)
    {
        data[i] = bdata[i];
    }
}
void dataList::Insert_sort()
{
    for (int i = 0; i <number; ++i) 
    {
        for (int j = i; j > 0; --j)
        {
            if (data[j] < data[j - 1]) 
            {
                int temp = data[j];
                data[j] = data[j - 1];
                data[j - 1] = temp;
            }
        }
    }
}
void dataList::Qick_sort(int start, int end)
{
    int i = start;
    int j = end;
    int temp = data[i];
    if (i < j)
    {
        while (i < j)
        {

            while (i < j &&  data[j] >= temp)
                j--;
            if (i < j)
            {
                data[i] = data[j];
                i++;
            }
            while (i < j && temp > data[i])
                i++;
            if (i < j)
            {
                data[j] = data[i];
                j--;
            }
        }
        data[i] = temp;
        Qick_sort(start, i - 1);
        Qick_sort(i + 1, end);
    }
    
}
void dataList::print(int kind)
{
    cout << "原始數據:      ";
    for (int i = 0; i < number; i++)
    {
        cout << bdata[i] << " ";
    }
    cout << endl;
    switch (kind)
    {
        case 1:
            cout << "簡單選擇排序後:";
            break;
        case 2:
            cout << "直接插入排序後:";
            break;
        case 3:
            cout << "快速排序後:    ";
            break;
    }
    for (int i = 0; i < number; i++)
    {
        cout << data[i] << " ";
    }
    reset();//打印完就需要重置待排序數組啦
    cout << endl;
}
void menu()//模擬菜單選項
{
    cout << "---------------------排序小程序[email protected]" << endl;
    cout << "|                                                       |" << endl;
    cout << "|       1____________簡單選擇排序                       |" << endl;
    cout << "|       2____________直接插入排序                       |" << endl;
    cout << "|       3____________快速排序                           |" << endl;
    cout << "|       4____________退出系統                           |" << endl;
    cout << "|                                                       |" << endl;
    cout << "---------------------------------------------------------" << endl;
}
int main()
{
    srand(time(NULL));
    dataList L(maxsize);
    menu();
    while (1)
    {
        int select;
        cout << "請輸入您的選擇:";
        cin >> select;
        switch (select)
        {
        case 1://簡單選擇排序
        {    
            L.Select_sort();
            L.print(select);
            break;
        }
        case 2://直接插入排序
            L.Insert_sort();
            L.print(select);
            break;
        case 3://快速排序
            L.Qick_sort(0,maxsize-1);
            L.print(select);
            break;
        case 4:
            system("pause");
            return 0;
        default:
            cout << "您輸入的選項有誤,請重新輸入:";
        }
    }

}
View Code

測試結果