就是前一段时间写的几个排序。

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
import time
import random
class OwnSort:
def __init__(self, count, range_var):
self.list = []
self.count = count
for i in range(count):
self.list.append(random.randint(0, range_var))

def bubble_sort(self):
i = 0
while i < self.count:
j = 0
flag = True
while j < self.count - 1:
if self.list[j] > self.list[j + 1]:
self.list[j], self.list[j+1] = self.list[j+1], self.list[j]
flag = False
j += 1
if flag:
break
i += 1

def select_sort(self):
i = 0
while i < self.count-1:
j = i + 1
min_index = i
while j < self.count:
if self.list[min_index] > self.list[j]:
min_index = j
j += 1
self.list[min_index], self.list[i] = self.list[i], self.list[min_index]
i += 1

def insert_sort(self):
i = 0
while i < self.count-1:
j = i
insert_value = self.list[j+1]
while j >= 0:
if insert_value < self.list[j]:
self.list[j+1] = self.list[j]
else:
break
j -= 1
self.list[j+1] = insert_value
i += 1

def partition_left(self, low, hight):
pivot = self.list[low]
while low < hight:
while low < hight and pivot <= self.list[hight]:
hight -= 1
self.list[low] = self.list[hight]
while low < hight and pivot >= self.list[low]:
low += 1
self.list[hight] = self.list[low]
self.list[low] = pivot
return low

def partition_right(self, low, hight):
i = k = low
# pivot = self.list[hight]
while i < self.count:
if self.list[hight] > self.list[i]:
self.list[i], self.list[k] = self.list[k], self.list[i]
i += 1
k += 1
else:
i += 1
self.list[hight], self.list[k] = self.list[k], self.list[hight]
return k

def quick_sort(self, low, hight):
if low < hight:
pivot = self.partition_right(low, hight)
self.quick_sort(low, pivot-1)
self.quick_sort(pivot+1, hight)

# 归并排序

def merge(self, low, mid, high):
listp = self.list.copy()
i = k = low
j = mid + 1
while i <= mid and j <= high:
if listp[i] <= listp[j]:
self.list[k] = listp[i]
i += 1
else:
self.list[k] = listp[j]
j += 1
k += 1
while i <= mid:
self.list[k] = listp[i]
k += 1
i += 1
while j <= high:
self.list[k] = listp[j]
k += 1
j += 1

def mergesort(self, low, high):
if low < high:
mid = (low + high) // 2
self.mergesort(low, mid - 1)
self.mergesort(mid + 1, high)
self.merge(low, mid, high)

# 堆排序

def adjust_max_heap(self, adjust_pos, length):
dad = adjust_pos
son = 2 * dad + 1
while son < length:
if son + 1 < length and self.list[son] < self.list[son + 1]:
son = son + 1
if self.list[dad] < self.list[son]:
self.list[dad], self.list[son] = self.list[son], self.list[dad]
dad = son
son = 2 * dad + 1
else:
break

def heapsort(self):
# 建堆
for i in range(self.length // 2 - 1, -1, -1):
self.adjust_max_heap(i, self.length)
# 对大根堆进行排序
self.list[0], self.list[self.length - 1] = self.list[self.length - 1], self.list[0]
for i in range(self.length - 1, 1, -1):
self.adjust_max_heap(0, i)
self.list[0], self.list[i - 1] = self.list[i - 1], self.list[0]
# 计数排序

def countsort(self):
listp = [0] * (self.var_range + 1)
k = 0
for num in self.list:
listp[num] += 1 # 每次统计这个位置的数则加1
# 对于整个辅助列表进行遍历
for i in range(self.var_range + 1):
for j in range(listp[i]):
self.list[k] = i
k += 1