algorithm-base/animation-simulation/数据结构和算法/简单选择排序.md

92 lines
4.6 KiB
Java
Raw Normal View History

2021-07-23 15:44:19 +00:00
> 如果阅读时发现错误或者动画不可以显示的问题可以添加我微信好友 **[tan45du_one](https://raw.githubusercontent.com/tan45du/tan45du.github.io/master/个人微信.15egrcgqd94w.jpg)** ,备注 github + 题目 + 问题 向我反馈
2021-03-20 08:30:29 +00:00
>
> 感谢支持该仓库会一直维护希望对各位有一丢丢帮助
>
2021-07-23 15:44:19 +00:00
> 另外希望手机阅读的同学可以来我的 <u>[**公众号袁厨的算法小屋**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u> 两个平台同步,想要和题友一起刷题,互相监督的同学,可以在我的小屋点击<u>[**刷题小队**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u>进入。
2021-03-20 08:30:29 +00:00
2021-03-20 07:58:25 +00:00
### **简单选择排序**
我们的冒泡排序不断进行交换通过交换完成最终的排序我们的简单选择排序的思想也很容易理解主要思路就是我们每一趟在 n-i+1 个记录中选取关键字最小的记录作为有序序列的第 i 个记录
![](https://cdn.jsdelivr.net/gh/tan45du/github.io.phonto2@master/myphoto/微信截图_20210120150816.4za4u7331sw0.png)
例如上图绿色代表已经排序的元素红色代表未排序的元素我们当前指针指向 4 则我们遍历红色元素从中找到最小值然后与 4 交换我们发现选择排序执行完一次循环也至少可以将 1 个元素归位
下面我们来看一下代码的执行过程看过之后肯定能写出代码的
我们为了更容易理解min 值保存的是值而不是索引实际代码中保存的是索引
2021-03-21 05:04:38 +00:00
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021032113041462.gif)
2021-03-20 07:58:25 +00:00
**简单选择排序代码**
Java Code:
2021-03-20 07:58:25 +00:00
```java
class Solution {
public int[] sortArray(int[] nums) {
int len = nums.length;
int min = 0;
for (int i = 0; i < len; ++i) {
min = i;
//遍历到最小值
2021-07-23 15:44:19 +00:00
for (int j = i + 1; j < len; ++j) {
if (nums[min] > nums[j]) min = j;
2021-03-20 07:58:25 +00:00
}
2021-07-23 15:44:19 +00:00
if (min != i) swap(nums,i,min);
2021-03-20 07:58:25 +00:00
}
return nums;
}
public void swap (int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
```
Python Code:
```python
from typing import List
class Solution:
def sortArray(self, nums: List[int])->List[int]:
leng = len(nums)
min = 0
for i in range(0, leng):
min = i
# 遍历到最小值
for j in range(i + 1, leng):
if nums[min] > nums[j]:
min = j
if min != i:
self.swap(nums, i, min)
return nums
def swap(self, nums: List[int], i: int, j: int):
temp = nums[i]
nums[i] = nums[j]
nums[j] = temp
```
2021-03-20 07:58:25 +00:00
**简单选择排序时间复杂度分析**
2021-07-23 15:44:19 +00:00
从简单选择排序的过程来看他最大的特点就是交换移动数据次数相当少这样也就节省了排序时间简单选择和冒泡排序不一样我们发现无论最好情况和最坏情况元素间的比较次数是一样的 i 次排序需要 n - i 次比较,n 代表数组长度则一共需要比较(n-1) + (n-2) +.... + 2 + 1= n\*(n-1)/2 对于交换而言最好情况交换 0 最坏情况(逆序时)交换 n - 1 那么简单选择排序时间复杂度也为 O(n^2) 但是其交换次数远小于冒泡排序所以其效率是好于冒泡排序的
2021-03-20 07:58:25 +00:00
**简单选择排序空间复杂度分析**
由我们动图可知我们的简单选择排序只用到了常量级的额外空间所以空间复杂度为 O(1)
**简单选择排序稳定性分析**
我们思考一下我们的简单选择排序是稳定的吗显然不是稳定的因为我们需要在指针后面找到最小的值与指针指向的值交换见下图
![](https://cdn.jsdelivr.net/gh/tan45du/github.io.phonto2@master/myphoto/微信截图_20210120153751.7dygihb0ko80.png)
此时我们需要从后面元素中找到最小的元素与指针指向元素交换也就是元素 2 但是我们交换后发现两个相等元素 3 的相对位置发生了改变所以简单选择排序是不稳定的排序算法
| 算法名称 | 最好时间复杂度 | 最坏时间复杂度 | 平均时间复杂度 | 空间复杂度 | 是否稳定 |
| ------------ | -------------- | -------------- | -------------- | ---------- | -------- |
| 简单选择排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 不稳定 |