各种排序方法(后续会更新)

好久没更博了,大三应该有更多的时间写东西。谢谢大家的支持!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//Sort_H.h
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
/*宏定义*/
#ifndef Sort_H
#define Sort_H
 
/*
    为了方便后面的桶排序,我们约定所要排列的数均不超过1000
*/
 
class Sort
{
public:
    Sort(int s);  //构造函数,初始化排序的数组
    int Size();
    void Insertion_sort();   //插入排序
    void Selection_sort();  //选择排序
    void Merge(int p,int q,int r);  //归并函数中的合并函数
    void merge_sort(int p,int r);  //归并排序
    void Merge_sort();  //合并
    void Bubble_sort();  //冒泡排序
    void Heap_sort();  //堆排序
    vector<int> Build_MAX_Heap(vector<int>& qq);   //建立最大堆
    void MAX_Heapify(vector<int>& qq,int index);   //维护最大堆
    int heap_size;  //堆大小
    void Quick_sort();   //快速排序
    void quickSort(vector<int> &list,int first,int last);  //快速排序中的划分
    int partition(vector<int> &list,int first,int last);   //划分数组list[first...last]
    void Bucket_Sort(vector<int> &list);   //桶排序
    void Bogo_Sort();
    void bogo_sort(vector<int> &list);
    /*
        Bogo排序(bogo-sort)是个既不实用又原始的排序算法,其原理等同将一堆卡片抛起,落在桌上后检查卡片是否已整齐排列好,若非就再抛一次。
        其名字源自Quantum bogodynamics,又称bozo sort、blort sort或猴子排序(参见无限猴子定理)。
        无限猴子定理:让一只猴子在打字机上随机地按键,当按键时间达到无穷时,几乎必然能够打出任何给定的文字,比如莎士比亚的全套著作。
    */
    void Shuffle(vector<int> &list);
    bool Inorder(vector<int> list);
private:
    vector<vector<int>> Bucket;
    vector<int> A;
    int size;
};
      
 
#endif

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
//Sort.cpp
 
#include "Sort_H.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cstdlib>
using namespace std;
const int MAX = 60000;
const int NUM = 3;
 
 
Sort::Sort(int s)
{
    size = s;
    cout << "请初始化数组里各个元素:" << endl;
    A.resize(s);
    int i;
    for(i = 0;i < size;i++)
    {
        cin >> A[i] ;
    }
    cout << "未排序前数组类各个元素分别为:" << endl;
    for(i = 0;i < size;i++)
        cout << A[i] << "  ";
    cout << endl;
}
 
int Sort::Size()
{
    return size;
}
 
void Sort::Insertion_sort()
{
    int key;
    int i,j;
    for(i = 1;i < size;i++)
    {
        key = A[i];
        j = i - 1;
        while(j >= 0 && key < A[j])
        {
            A[j+1] = A[j];
            j--;
        }
        A[j+1] = key;
    }
    cout << "将插入排序处理后序列为:" << endl;
    for(i = 0;i < size;i++)
        cout << A[i] << "  " ;
    cout << endl;
}
 
//冒泡排序
void Sort::Bubble_sort()
{
    int i,j;
    for(i = 0;i < size;i++)
    {
        for(j = size - 1;j > i ;j--)
        {
            if(A[j] < A[j-1])
                swap(A[j],A[j-1]);
        }
    }
    cout << "将冒泡排序处理后序列为:" << endl;
    for(i = 0;i < size;i++)
        cout << A[i] << "  " ;
    cout << endl;
}
 
//选择排序
void Sort::Selection_sort()
{
    int i,j;
    for(i = 0;i < size;i++)
    {
        int index = i;
        for(j = i;j < size;j++)
        {
            if(A[index] > A[j])
            {
                index = j;
            }
        }
        swap(A[i],A[index]);
    }
    cout << "将选择排序处理后序列为:" << endl;
    for(i = 0;i < size;i++)
        cout << A[i] << "  " ;
    cout << endl;
}
 
//合并过程
//起于p,终于r,分割点为q
void Sort::Merge(int p,int q,int r)
{
    int i,j,k;
    int n1 = q - p + 1;
    int n2 = r - q;
    vector<int> L;
    vector<int> R;
    L.resize(n1+1);
    R.resize(n2+1);
    for(i = 0;i < n1;i++)
    {
        L[i] = A[p+i];
    }
    for(i = 0;i < n2;i++)
    {
        R[i] = A[q+i+1];
    }
    //哨兵值
    L[n1] = MAX;
    R[n2] = MAX;
    i = j = 0;
    for(k = p;k <= r;k++)
    {
        if(L[i] <= R[j])
        {
            A[k] = L[i];
            i++;
        }
        else
        {
            A[k] = R[j];
            j++;
        }
    }
}
 
 
void Sort::merge_sort(int p,int r)
{
    if(p < r)
    {
        int q = (p + r)/2;
        merge_sort(p,q);
        merge_sort(q + 1,r);
        Merge(p,q,r);
    }
}
 
//归并排序
void Sort::Merge_sort()
{
    merge_sort(0,Size() - 1);
    cout << "将归并排序处理后序列为:" << endl;
    for(int i = 0;i < size;i++)
        cout << A[i] << "  " ;
    cout << endl;
}
 
 
void Sort::Heap_sort()
{
    vector<int> result;
    result = Build_MAX_Heap(A);
    heap_size = A.size();
    A.clear();
    int i;
    for(i = result.size();i >= 2;i--)
    {
        swap(result[0],result[i-1]);
        A.push_back(result[i-1]);
        result.pop_back();
        heap_size--;
        MAX_Heapify(result,0);
    }
    A.push_back(result[0]);
    cout << "将堆排序处理后序列为:" << endl;
    for(int i = 0;i < size;i++)
        cout << A[i] << "  " ;
    cout << endl;
}
 
vector<int> Sort::Build_MAX_Heap(vector<int> & qq)
{
    vector<int> result;
    int n = qq.size();
    result = qq;
    int i;
    for(i = n/2;i >= 1;i--)
    {
        MAX_Heapify(result,i-1);
    }
    return result;
}
 
void Sort::MAX_Heapify(vector<int>& qq,int index)  //维护最大堆
{
    int left = 2*index + 1;
    int right = 2*index + 2;
    int largest ;
    if(index > qq.size()/2 -1)
        ;
    if(left < qq.size() && qq[left] < qq[index])
        largest = left;
    else
        largest = index;
    if(right < qq.size() && qq[right] < qq[largest])
        largest = right;
    if(largest != index)
    {
        swap(qq[index],qq[largest]);
        MAX_Heapify(qq,largest);
    }
}
 
int Sort::partition(vector<int> &list,int first,int last)
{
    int pivot = list[first];
    int low = first + 1;
    int high = last;
 
    while(high > low)
    {
        //从左端向前
        while(low <= high && list[low] <= pivot)
            low++;
        //从右端向后
        while(low <= high && list[high] > pivot)
            high--;
 
        //交换表中两个元素
        if(high > low)
        {
            int temp = list[high];
            list[high] = list[low];
            list[low] = temp;
        }
    }
 
    while(high > first && list[high] >= pivot)
        high--;
 
    //交换pivot和list[high]
    if(pivot > list[high])
    {
        list[first] = list[high];
        list[high] = pivot;
        return high;
    }
    else
        return first;
}
 
void Sort::quickSort(vector<int> &list,int first,int last)
{
    if(last > first)
    {
        int pivotIndex = partition(list,first,last);
        quickSort(list,first,pivotIndex - 1);
        quickSort(list,pivotIndex + 1,last);
    }
 
}
 
void Sort::Quick_sort()
{
    quickSort(A,0,A.size()-1);
    cout << "将快速排序处理后序列为:" << endl;
    for(int i = 0;i < size;i++)
        cout << A[i] << "  " ;
    cout << endl;
}
 
void Sort::Bucket_Sort(vector<int> &list)
{
    Bucket.resize(10);
    int i,j,k;
    for(i = 0;i < list.size();i++)
    {
        Bucket[list[i] % 100].push_back(list[i]);
    }
    j = 0;
    for(i = 0;i < 10;i++)
    {
        if(!Bucket[i].empty())
        {
            for(k = 0;k < Bucket[i].size();k++)
                list[j++] = Bucket[i][k];
        }
    }
    for(i = 0;i < 10;i++)
        Bucket[i].clear();
    for(i = 0;i < list.size();i++)
    {
        Bucket[list[i] / 10 % 10].push_back(list[i]);
    }
    j = 0;
    for(i = 0;i < 10;i++)
    {
        if(!Bucket[i].empty())
        {
            for(k = 0;k < Bucket[i].size();k++)
                list[j++] = Bucket[i][k];
        }
    }
    for(i = 0;i < 10;i++)
        Bucket[i].clear();
    for(i = 0;i < list.size();i++)
    {
        Bucket[list[i] / 100].push_back(list[i]);
    }
    j = 0;
    for(i = 0;i < 10;i++)
    {
        if(!Bucket[i].empty())
        {
            for(k = 0;k < Bucket[i].size();k++)
                list[j++] = Bucket[i][k];
        }
    }
    cout << "将桶排序处理后序列为:" << endl;
    for(int i = 0;i < size;i++)
        cout << list[i] << "  " ;
    cout << endl;
}
 
void Sort::Bogo_Sort()
{
    bogo_sort(A);
}
 
void Sort::bogo_sort(vector<int> &list)
{
    while(!Inorder(list))
        Shuffle(list);
    cout << "将猴子排序处理后序列为:" << endl;
    for(int i = 0;i < size;i++)
        cout << list[i] << "  " ;
    cout << endl;
}
 
void Sort::Shuffle(vector<int> &list)
{
    int i;
    int length = list.size();
    srand(time(0));
    for(i = 0;i < list.size();i++)
    {
        int num = rand() % length;
        int temp = list[num];
        list[num] = list[i];
        list[i] = temp;
    }
}
 
bool Sort::Inorder(vector<int> list)
{
    for (int i = 0; i < list.size() - 1; i++) {
        if (list[i] > list[i+1])
            return false;
    }
    return true;
}
 
 
         
 
    

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//test.cpp
 
#include <iostream>
#include <vector>
#include "Sort_H.h"
using namespace std;
int main()
{
    Sort s(6);
    //s.Insertion_sort();
    //s.Bubble_sort();
    //s.Selection_sort();
    //s.Merge_sort();
    //s.Heap_sort();
    //s.Quick_sort();
    s.Bogo_Sort();
    return 0;
}

 

 

posted @   中大黑熊  阅读(360)  评论(0编辑  收藏  举报
编辑推荐:
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
阅读排行:
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 2025成都.NET开发者Connect圆满结束
点击右上角即可分享
微信分享提示