有趣的算法(二)-选择排序
选择排序
这几天河北山西等地又出现疫情,小冷真心祝愿那些负重前行的天使们健康平安,还有就是在外面工作的同学盆友和在外面学习的同学,回家路上保护好自己,注意安全,平平安安的放假回家。好像听见了凯旋的号声!
今天下冷继续接着上次的算法分享,首先说一下今天分享主题排序,当然排序有好多种,冒泡排序,插入排序,还有上次讲的二分法排序等等。
*** 选择 ***
-
选择排序,关键就在"选择"上
工作原理:
第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
简单排序原理
初始值:[1 9 8 5 6 7 4 3 2]
第一趟:[9 1 8 5 6 7 4 3 2]
#选择出此轮最大数9,和索引0数交换选择
第二趟:[9 8 1 5 6 7 4 3 2]
#选择出次轮最大数8,和索引1数交换,下面的工作方式以此类推。
第三趟:[9 8 7 5 6 1 4 3 2]
第四趟:[9 8 7 6 5 1 4 3 2]
第五趟:[9 8 7 6 5 1 4 3 2]
第六趟:[9 8 7 6 5 4 1 3 2]
第七趟:[9 8 7 6 5 4 3 1 2]
第八趟:[9 8 7 6 5 4 3 2 1]
*** 内存的工作原理 ***
数组和链表
两种不同的数据结构,
数组 的结构可以看作是一个容器,在向这个容器中装东西时候需要给每个东西挂一个带有号码牌的绳子,如果想要哪个可以直接选中号码牌对应的绳子,将对应的东西拉出来,好处是在找的时候方便
链表 的话,可以简单看作一个首尾连接的火车头,而这每一节车厢都标有号码,这时候在插入和拆除的时候会比较方便
之后在学习数据结构时候小冷在详细说一下这两种结构的细节以及区别
单链删除
单链添加
双链删除
双链添加
代码示例
python代码
# 选择排序
def findSmallest(arr):
smallest = arr[0]
smallest_index = 0
for i in range(1, len(arr)):
if arr[i] < smallest:
smallest = arr[i]
smallest_index = i
return smallest_index
# 现在可以使用这个函数来编写选择排序算法了。
def selectionSort(arr):
newArr = []
for i in range(len(arr)):
smallest = findSmallest(arr)
newArr.append(arr.pop(smallest))
return newArr
print (selectionSort([5, 3, 6, 2, 10]))
java代码
// 选择排序
@Test
public void selectSort() {
int[] arr = {49, 38, 65, 97, 76, 13, 27, 49};
for (int i = 0; i < arr.length - 1; i++) {
int index = i;
int j;
// 找出最小值得元素下标
for (j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[index]) {
index = j;
}
}
int tmp = arr[index];
arr[index] = arr[i];
arr[i] = tmp;
System.out.println(Arrays.toString(arr));
}
}