一、选择排序简介
选择排序原理:
第一次,拿0索引原始和后面的所有原始进行比较,小的往前放,第一次完毕,最小值出现在了最小索引处。
第二次,拿1索引原始和后面的所有原始进行比较,小的往前放,第二次完毕,次小值出现在了次小索引处。
即:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换。第二次从R[1]~R[n-1]中选取最小值与R[1]交换。。。以此类推。通俗点说就是每次找到后面元素的最小值然后与之交换
定义待排序的数组 int[] arr = { 24, 69, 80, 57, 13 };
代码实现:
public static void main(String[] args) { // 定义数组 int[] arr = { 24, 69, 80, 57, 13 }; // 选择排序 selectSort(arr); // 遍历数组 printArray(arr); } // 选择排序 public static void selectSort(int[] arr) { for (int x = 0; x < arr.length - 1; x++) { for (int y = x + 1; y < arr.length; y++) { if (arr[y] < arr[x]) { int temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; } } } } // 遍历数组 public static void printArray(int[] arr) { System.out.print("["); for (int x = 0; x < arr.length; x++) { if (x == arr.length - 1) { System.out.print(arr[x]); } else { System.out.print(arr[x] + ", "); } } System.out.println("]"); }
输出结果
[13, 24, 57, 69, 80]
选择排序的示例动画。红色表示当前最小值,黄色表示已排序序列,蓝色表示当前位置。")选择排序的示例动画。红色表示当前最小值,黄色表示已排序序列,蓝色表示当前位置。从算法逻辑上看,选择排序是一种简单直观的排序算法,在简单选择排序过程中,所需移动记录的次数比较少。
选择排序的基本思想:比较 + 交换。在未排序序列中找到最小(大)元素,存放到未排序序列的起始位置。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。①. 从待排序序列中,找到关键字最小的元素; ②. 如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换; ③. 从余下的 N - 1 个元素中,找出关键字最小的元素,重复①、②步,直到排序结束。以下是选择排序复杂度:
平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 |
---|---|---|---|
O(n²) | O(n²) | O(n²) | O(1) |
选择排序的简单和直观名副其实,这也造就了它”出了名的慢性子”,无论是哪种情况,哪怕原数组已排序完成,它也将花费将近n²/2次遍历来确认一遍。即便是这样,它的排序结果也还是不稳定的。 唯一值得高兴的是,它并不耗费额外的内存空间.
二、冒泡排序简介
基本思想
冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。冒泡排序是我们得最多的排序方式之一,原因是简单易实现,且原理易懂。顾名思义,冒泡排序,它的排序过程就像水中的气泡一样,一个一个上浮到水面。
算法描述
①. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
②. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
③. 针对所有的元素重复以上的步骤,除了最后一个。
④. 持续每次对越来越少的元素重复上面的步骤①~③,直到没有任何一对数字需要比较
代码实现
相邻元素两两比较。大的往后放,第一次比较完成后,最大值出现在最大索引处。冒泡排序需要两个嵌套的循环,
public static void main(String[] args) { int[] arr = { 24, 69, 80, 57, 13 }; sortBubbo(arr); printArray(arr); } //从小到大排序 public static void sortBubbo(int[] arr){ for(int x=0;x<arr.length-1;x++){ for(int y=0;y<arr.length-1-x;y++){ if(arr[y]>arr[y+1]){ int temp = arr[y]; arr[y] = arr[y+1]; arr[y+1] = temp; } } } } public static void printArray(int[] arr) { System.out.print("["); for (int x = 0; x < arr.length; x++) { if (x == arr.length - 1) { System.out.print(arr[x]); } else { System.out.print(arr[x] + ", "); } } System.out.println("]"); }
以下是冒泡排序算法复杂度:
平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 |
---|---|---|---|
O(n²) | O(n) | O(n²) | O(1) |
冒泡排序是最容易实现的排序, 最坏的情况是每次都需要交换, 共需遍历并交换将近n²/2次, 时间复杂度为O(n²). 最佳的情况是内循环遍历一次后发现排序是对的, 因此退出循环, 时间复杂度为O(n). 平均来讲, 时间复杂度为O(n²). 由于冒泡排序中只有缓存的temp变量需要内存空间, 因此空间复杂度为常量O(1).
Tips: 由于冒泡排序只在相邻元素大小不符合要求时才调换他们的位置, 它并不改变相同元素之间的相对顺序, 因此它是稳定的排序算法.