-
Notifications
You must be signed in to change notification settings - Fork 4
/
SelectionSort.js
152 lines (112 loc) · 3.55 KB
/
SelectionSort.js
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
/**
* @Author: zhuxiankang
* @Date: 2018-10-22 08:49:39
* @Desc: 选择排序
*/
/**
选择排序:
选择排序从数组的开头开始,将第一个元素和其他元素进行比较。检查完所有元素后,最小的元素会被放到数组的第一个位置。
然后算法会从第二个位置继续。这个过程一直进行,当进行到数组的倒数第二个位置时,所有的数据便完成了排序。
举例说明:要排序数组:let arr= [6,3,8,2,9,1]
第1趟排序(次数 6 - 1 = 5):
以第1个元素为起始位置,比较5次确定最小值1,插入到第1个位置:1,6,3,8,2,9
---------------------------------------------------------------------
第2趟排序(次数 6 - 2 = 4):
以第2个元素为起始位置,比较4次确定最小值2,插入到第2个位置:1,2,6,3,8,9
---------------------------------------------------------------------
第3趟排序(次数 6 - 3 = 3):
以第3个元素为起始位置,比较3次确定最小值3,插入到第3个位置:1,2,3,6,8,9
---------------------------------------------------------------------
第4趟排序(次数 6 - 4 = 2):
以第4个元素为起始位置,比较2次确定最小值6,插入到第4个位置:1,2,3,6,8,9
---------------------------------------------------------------------
第5趟排序(次数 6 - 5 = 1):
以第5个元素为起始位置,比较1次确定最小值8,插入到第5个位置:1,2,3,6,8,9
---------------------------------------------------------------------
最终结果:1 2 3 6 8 9
---------------------------------------------------------------------
选择排序的时间复杂度是O(n2)。
*/
// 辅助数组类
// ---------------------------------------------------------------------
/**
* @Author: zhuxiankang
* @Date: 2018-10-19 19:08:59
* @Desc: 辅助数组类
* @Parm:
*/
function CArray(number) {
this.data = []
for(let i=0; i<number; i++) {
this.data[i] = i
}
}
/**
* @Author: zhuxiankang
* @Date: 2018-10-19 19:14:38
* @Desc: 设置随机数
* @Parm:
*/
CArray.prototype.random = function() {
for (let i=0,len=this.data.length; i <len; ++i) {
this.data[i] = Math.floor(Math.random() * (len + 1))
}
}
/**
* @Author: zhuxiankang
* @Date: 2018-10-19 19:14:38
* @Desc: 清除数据
* @Parm:
*/
CArray.prototype.clear = function() {
for (let i=0,len=this.data.length; i <len; ++i) {
this.data[i] = 0
}
}
/**
* @Author: zhuxiankang
* @Date: 2018-10-19 19:16:04
* @Desc: 显示数据
* @Parm:
*/
CArray.prototype.show = function() {
let retstr = ''
for (let i=0,len=this.data.length; i <len; ++i) {
retstr += this.data[i] + " ";
if (i > 0 & i % 10 == 0) {
retstr += "\n";
}
}
return retstr
}
/**
* @Author: zhuxiankang
* @Date: 2018-10-19 19:19:13
* @Desc: 交换数据
* @Parm:
*/
CArray.prototype.swap = function(index1, index2) {
let temp = this.data[index1]
this.data[index1] = this.data[index2]
this.data[index2] = temp
}
let arr = new CArray(100)
arr.random()
console.log(arr.show())
// 选择排序
// ---------------------------------------------------------------------
CArray.prototype.selectionSort = function() {
for(let i=0,len=this.data.length; i<len-1; i++) {
// 默认每次比较的起始作为最小值
let min = i
// 比较出以i为起始的最小值
for(let j=i+1; j<=len-1; j++) {
if(this.data[min] > this.data[j]) {
min = j
}
}
this.swap(i, min)
}
}
arr.selectionSort()
console.log(arr.show())