-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathBubble_QuickSort.cpp
132 lines (124 loc) · 2.12 KB
/
Bubble_QuickSort.cpp
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
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<assert.h>
#include<string.h>
using namespace std;
//交换排序—冒泡排序
void Bubble_Sort(int* a,size_t size)
{
assert(a);
assert(size);
int end = size - 1;
while (end)
{
bool flag = false; //增加标志位,一种优化
for (int i = 0; i < end; i++)
{
if (a[i]>a[i + 1])
{
swap(a[i], a[i + 1]);
flag = true;
}
}
if (flag == false)
break;
end--;
}
}
//快排 递归
//三数取中
int GetMid(int* a, int begin, int end) //返回下标
{
assert(a);
//assert(end);
if (end - begin < 0)
{
perror("indexerr");
return 0;
}
int mid = begin + ((end - begin) >> 1);
if (a[begin] > a[end])
{
if (a[mid] >= a[begin])
return begin;
else
{
if (a[mid] >= a[end])
return mid;
else
return end;
}
}
else if (a[begin] < a[end])
{
if (a[mid] <= a[begin])
return begin;
else
{
if (a[mid] <= a[end])
return mid;
else
return end;
}
}
else
return begin;
}
//左右指针
int PartSort(int* a, int left, int right)
{
assert(a);
int begin = left;
int end = right;
int key = a[end];
while (begin < end)
{
while (begin < end&&a[begin] <= key) //注意条件:注意是>= 如果是相等的元素的话,很可能就死循环了
{
begin++;
}
while (begin < end&&a[end] >= key)
{
end--;
}
if (begin < end)
swap(a[begin], a[end]);
}
if (begin == end)
{
swap(a[begin], a[right]);
return begin;
}
}
//递归过程
void QuickSort(int* a, int begin, int end)
{
if (begin < end)
{
int MidValueIndex = GetMid(a, begin, end); //使用三数取中让数组的最后一个值是中间值。
swap(a[MidValueIndex], a[end]);
int Mid = PartSort(a, begin, end);
QuickSort(a, begin, Mid - 1);
QuickSort(a, Mid + 1, end);
}
else
return;
}
void test()
{
//测试用例 ,這种使用排序的数组的测试用例,短可测常别测。
int arr[] = { 5, 4, 3, 1, 6, 5 };
//int arr[] = { 1, 1, 1, 1, 1, 1 };
//Bubble_Sort(arr, sizeof(arr) / sizeof(arr[0]));
QuickSort(arr, 0, sizeof(arr) / sizeof(arr[0]) - 1);
for (size_t i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
int main()
{
test();
return 0;
}