关于排序算法,常见的大致有:冒泡排序、插入排序、选择排序、快速排序、归并排序、桶排序、计数排序等。每一种排序算法都有它们各自的优劣和适用场景。一般可以从这么几个角度来衡量排序算法:
1.最好时间复杂度、最坏时间复杂度、平均时间复杂度
2.是否是原地排序算法:原地排序算法,指空间复杂度为O(1)
3.是否是稳定排序算法:稳定排序算法,指如果待排序序列中有值相等的元素,经过排序之后,值相等元素的顺序保持不变
关于选择排序:
#描述选择排序: 1.选择排序的思路,与插入排序思路类似。 2.将待排序数据分为:已排序区间、未排序区间 3.区别在于选择排序,每次会从未排序区间中找到最小的元素,将其放到已排序区间的末尾 4.重复过程3,直到未排序区间的元素为空,则排序结束
代码实现:
/** * 选择排序: * 1.选择排序的思路,与插入排序思路类似 * 2.将待排序数据分为:已排序区间、未排序区间 * 3.区别在于选择排序,每次会从未排序区间中找到最小的元素,将其放到已排序区间的末尾 * 4.重复过程3,直到未排序区间的元素为空,则排序结束 * 5.选择排序是原地排序:空间复杂度O(1) * 6.选择排序是不稳定的排序算法 * 7.最好时间复杂度、最坏时间复杂度、平均时间复杂度:都是O(n^2) * * @param a 待排序序列 * @param n 数据规模 */ public static void selectionSort(int[] a,int n){ if(n <=1) return; // 最小值索引 int minIndex=0; // 临时存储值 int temp=0; // 进行n-1次比较即可 for(int i=0;i<n-1;i++){ // 记录每次比较最小值 minIndex = i; // 第i次需要比较的数据 for(int j=i+1;j<n;j++){ if(a[minIndex]>a[j]){ // 记录最小值位置 minIndex = j; } } // 执行交换 temp = a[i]; a[i] = a[minIndex]; a[minIndex] = temp; } }