选择排序
1、什么是选择排序?
第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。
选择排序是一种不稳定的排序方法。
2、什么是算法的稳定性?
简单来说就是改变了数组中相同值元素本身的排序顺序
如使用选择排序算法排序,序列3 8 3 2 6,我们知道第一遍选择第1个元素3会和2交换,在之后的排序中两个3不再交换位置,那么原序列中两个3的相对前后顺序就被破坏了,则称选择排序是不稳定的。
3、时间复杂度和空间复杂度
需要一个临时变量用来交换数组内数据位置,所以空间复杂度为O(1)
选择排序的时间分析:
选择排序的交换操作介于 0 和(n - 1) 次之间。选择排序的比较操作为 n (n - 1) / 2 次之间。选择排序的赋值操作介于 0 和 3 (n - 1) 次之间。
因为无论原数组是否有序,都需要比较,所以时间复杂度为O(n^2)
4、代码示例
class Test { public static void main(String[] args) { int[] arr = {1,5,2,0,6,9,12,3,2}; //选择排序 selectSortArr(arr); } /* 选择排序 */ public static void selectSortArr(int[] arr){ for(int i=0;i<arr.length;i++){ for(int j=i+1;j<arr.length;j++){ //判断 if(arr[i]>arr[j]){ //完成数组的两个位置的值的交换 swap(arr,i,j); } }; } } /* 数组的两个数值交换 */ public static void swap(int[] arr,int i,int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }
冒泡排序
1、什么是冒泡排序?
排序时就像水中的气泡一样慢慢浮到顶端,所以称为冒泡排序。
2、算法原理
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
3、时间复杂度和空间复杂度
如果原数组为基本排好序的数组,则比较次数为最小值n-1和移动次数最小值0 此时时间复杂度为O(n)
如果原数组为逆序,则为最坏情况,比较次数为n(n-1)/2,移动次数为3n(n-1)/2 此时时间复杂度为O(n^2)
所以平均复杂度为O(n^2)
需要一个临时变量用来交换数组内数据位置,所以空间复杂度为O(1)
4、代码示例
class Test2 { public static void main(String[] args) { int[] arr = {2,7,5,3,6,8,9}; printArr(arr); for(int i=0;i<arr.length-1;i++){ for(int j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1]){ int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } }