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
|
/// <summary>
/// 冒泡排序
/// </summary>
/// <param name="arr"></param>
public
void
Sort(
int
[] arr)
{
for
(
int
i = arr.Length - 1; i > 0; i--)
{
for
(
int
j = 0; j < i; j++)
{
if
(arr[i] < arr[j])
{
int
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
/// <summary>
/// 插入排序
/// </summary>
/// <param name="arr"></param>
public
void
Sort(
int
[] arr)
{
for
(
int
i = 1; i < arr.Length; i++)
{
int
t = arr[i];
int
j = i;
while
((j > 0) && (arr[j - 1] > t))
{
arr[j] = arr[j - 1];
//交换顺序
--j;
}
arr[j] = t;
}
}
/// <summary>
/// 快速排序
/// </summary>
/// <param name="list"></param>
/// <param name="low"></param>
/// <param name="high"></param>
public
void
Sort(
int
[] list,
int
low,
int
high)
{
int
pivot;
int
l, r;
int
mid;
if
(high <= low)
return
;
else
if
(high == low + 1)
{
if
(list[low] > list[high])
Swap(
ref
list[low],
ref
list[high]);
return
;
}
mid = (low + high) >> 1;
pivot = list[mid];
Swap(
ref
list[low],
ref
list[mid]);
l = low + 1;
r = high;
do
{
while
(l <= r && list[l] < pivot)
l++;
while
(list[r] >= pivot)
r--;
if
(l < r)
Swap(
ref
list[l],
ref
list[r]);
}
while
(l < r);
list[low] = list[r];
list[r] = pivot;
if
(low + 1 < r)
Sort(list, low, r - 1);
if
(r + 1 < high)
Sort(list, r + 1, high);
}
/// <summary>
/// 交换位置ExchageValue
/// </summary>
/// <param name="l"></param>
/// <param name="r"></param>
private
void
Swap(
ref
int
l,
ref
int
r)
{
int
temp;
temp = l;
l = r;
r = temp;
}
/// <summary>
/// 希尔排序
/// </summary>
/// <param name="arr"></param>
public
void
Sort(
int
[] arr)
{
int
inc;
for
(inc = 1; inc <= arr.Length / 9; inc = 3 * inc + 1) ;
for
(; inc > 0; inc /= 3)
{
for
(
int
i = inc + 1; i <= arr.Length; i += inc)
{
int
t = arr[i - 1];
int
j = i;
while
((j > inc) && (arr[j - inc - 1] > t))
{
arr[j - 1] = arr[j - inc - 1];
//交换数据
j -= inc;
}
arr[j - 1] = t;
}
}
}
/// <summary>
/// 基数排序
/// </summary>
/// <param name="arr"></param>
/// <param name="digit"></param>
/// <returns></returns>
public
int
[] Sort(
int
[] arr,
int
digit)
{
//low to high digit
for
(
int
k = 1; k <= digit; k++)
{
//temp array to store the sort result inside digit
int
[] tmpArray =
new
int
[arr.Length];
//temp array for countingsort
int
[] tmpCountingSortArray =
new
int
[10] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
//CountingSort
for
(
int
i = 0; i < arr.Length; i++)
{
//split the specified digit from the element
int
tmpSplitDigit = arr[i] / (
int
)Math.Pow(10, k - 1) - (arr[i] / (
int
)Math.Pow(10, k)) * 10;
tmpCountingSortArray[tmpSplitDigit] += 1;
}
for
(
int
m = 1; m < 10; m++)
{
tmpCountingSortArray[m] += tmpCountingSortArray[m - 1];
}
//output the value to result
for
(
int
n = arr.Length - 1; n >= 0; n--)
{
int
tmpSplitDigit = arr[n] / (
int
)Math.Pow(10, k - 1) - (arr[n] / (
int
)Math.Pow(10, k)) * 10;
tmpArray[tmpCountingSortArray[tmpSplitDigit] - 1] = arr[n];
tmpCountingSortArray[tmpSplitDigit] -= 1;
}
//copy the digit-inside sort result to source array
for
(
int
p = 0; p < arr.Length; p++)
{
arr[p] = tmpArray[p];
}
}
return
arr;
}
|
已完成以下算法:冒泡排序,插入排序,希尔排序,快速排序,基数排序
最新推荐文章于 2024-08-26 14:49:43 发布