vlambda博客
学习文章列表

五分钟理解选择排序算法




五分钟理解选择排序


2021/1/20

01


选择排序



概念

也是和冒泡排序一样,作为排序算法的必学入门算法之一。


排序原理

1.每一次遍历的过程中,都假定第一个索引处的元素是最小值,和其他索引处的值依次进行比较,如果当前索引处的值大于其他某个索引处的值,则假定其他某个索引出的值为最小值,最后可以找到最小值所在的索引
2.交换第一个索引处和最小值所在的索引处的值
可以理解为每次遍历,选择出最小元素,把他放在数据的最前面,再同样的操作一直执行。直到最后排序完成!!

02


算法图示

五分钟理解选择排序算法

03


Java代码实现

package selectsort;import java.util.Arrays;public class selectSort { /** *选择排序主方法 * @param arr */ public static void selectSort(int [] arr){ if (arr==null||arr.length<2){ return; } for (int i=0;i<arr.length-1;i++){ int minIndex = i; for (int j=i+1;j<arr.length;j++){ minIndex=arr[j]<arr[minIndex]?j:minIndex; } if (minIndex!=i){ swap(arr,i,minIndex); } } } /** * 交换数据的方法 * @param arr * @param i * @param j */ public static void swap(int[] arr, int i,int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;    } public static void main(String[] args) { int array[] = {2,31,-8,45,42,4,0}; System.out.println("排序前:"+Arrays.toString(array)); selectSort(array); System.out.println("排序后:"+Arrays.toString(array)); }}

04


C++实现:

#include <iostream>#include<algorithm>using namespace std;/** * 选择排序核心方法 */ void selectSort(int* a,int len){ int temp; for (int i = 0; i <len ; ++i) { int minIndex = i; for (int j = i+1; j <len ; ++j) { minIndex=a[j]<a[minIndex]?j:minIndex; } //交换数据 if (i!=minIndex){ temp = a[i]; a[i] = a[minIndex]; a[minIndex] = temp; } }}/** * 打印数组方法 */ void printArray(int* a, int len){ for (int i = 0; i <len ; ++i) { cout<<a[i]; } cout<<endl;}/** * 测试主函数 */int main(){ int array[] = {2,31,-8,45,42,4,0}; //获取数组长度 int len = sizeof(array)/sizeof(array[0]); cout<<"排序前:", printArray(array,len); cout<<"排序后:", selectSort(array,len), printArray(array,len); //养成好习惯 return 0;}


05


Python实现

'''选择排序方法'''def selectSort(arr): arr_len = len(arr) if arr_len<2: return for i in range(arr_len): minIndex = i for j in range(i+1, arr_len): if arr[minIndex] > arr[j]: minIndex = j if i != minIndex: arr[i], arr[minIndex] = arr[minIndex], arr[i]
'''测试'''test_arr = [2,31,-8,45,42,4,0]print("排序前:",test_arr)selectSort(test_arr)print("排序后:",test_arr)


02


复杂度分析

选择排序使用了双层for循环,其中外层循环完成了数据交换,内层循环完成了数据比较,所以我们分别统计数据

交换次数和数据比较次数:
数据比较次数:(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2;
数据交换次数:N-1
时间复杂度:N2/2-N/2+(N-1)=N2/2+N/2-1;
根据大O推导法则,保留最高阶项,去除常数因子时间复杂度为O(N^2);
声明:文中涉及图片来自网络,如有侵权,请联系博主删除!


01


测试结果截图

五分钟理解选择排序算法

五分钟理解选择排序算法

五分钟理解选择排序算法

五分钟理解选择排序算法

白码手记


扫码关注更多精彩内容