数据结构与算法之选择排序
2018-03-23 00:32
435 查看
选择排序也是排序算法当中比较基础的排序之一;
其核心思想就是将第一个元素与后面的所有元素进行比较,如果比其他的元素大就进行交换,则经过一次比较之后第一个元素就会变成最小的元素,然后第二次从第二个元素一直到最后一个进行此操作,选择出第二小的元素放在第二个位置,依此类推。
给定数组:7 4 3 9 5 1。
第一趟:将7与4进行比较,大于4交换位置。然后将4与3进行比较,大于3交换位置。然后3与9进行比较,小于9位置不变,与5比较小于5,位置不变,与1比较大于1交换位置。
第一趟排序后的结果为:1 7 4 9 5 3
同理可得第二趟的排序后结果为:1 3 7 9 5 4
第三趟:1 3 4 9 7 5
第四趟:1 3 4 5 9 7
第五趟:1 3 4 5 7 9
排序完成。
下面是算法程序的实现:public static void sort(int[] arr, int n){
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
if (arr[i] > arr[j]){
swap(arr, i, j);
}
}
}
}
下面来考虑一下优化。我们每趟排序的时候选择出一个最小值,排序n-1次,比较的次数也是由n-1到1.显然时间复杂度是O(n²)
如果我们每次在决出一个最小值得同时决出一个最大值的话,效率明显会提升不少,循环的次数也会减半。
下面是优化后的程序。public static void sort(int[] arr, int n){
int left = 0;
int right = n-1;
int min = 0;
int max = 0;
while (left < right){
min = left;
max = right;
for (int i = left; i <= right; i++) {
if (arr[i] < arr[min]){
min = i;
}
if (arr[i] > arr[max]){
max = i;
}
}
swap(arr, left, min);
if (left == max){//如果在一次循环中,最大值刚好是最左边的元素,那么交换后的最大值下标就是min了,所以将min赋值给最大值的下标即可
System.out.println(arr[left]);
max = min;
}
swap(arr, right, max);
left++;
right--;
}
}
其核心思想就是将第一个元素与后面的所有元素进行比较,如果比其他的元素大就进行交换,则经过一次比较之后第一个元素就会变成最小的元素,然后第二次从第二个元素一直到最后一个进行此操作,选择出第二小的元素放在第二个位置,依此类推。
给定数组:7 4 3 9 5 1。
第一趟:将7与4进行比较,大于4交换位置。然后将4与3进行比较,大于3交换位置。然后3与9进行比较,小于9位置不变,与5比较小于5,位置不变,与1比较大于1交换位置。
第一趟排序后的结果为:1 7 4 9 5 3
同理可得第二趟的排序后结果为:1 3 7 9 5 4
第三趟:1 3 4 9 7 5
第四趟:1 3 4 5 9 7
第五趟:1 3 4 5 7 9
排序完成。
下面是算法程序的实现:public static void sort(int[] arr, int n){
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
if (arr[i] > arr[j]){
swap(arr, i, j);
}
}
}
}
下面来考虑一下优化。我们每趟排序的时候选择出一个最小值,排序n-1次,比较的次数也是由n-1到1.显然时间复杂度是O(n²)
如果我们每次在决出一个最小值得同时决出一个最大值的话,效率明显会提升不少,循环的次数也会减半。
下面是优化后的程序。public static void sort(int[] arr, int n){
int left = 0;
int right = n-1;
int min = 0;
int max = 0;
while (left < right){
min = left;
max = right;
for (int i = left; i <= right; i++) {
if (arr[i] < arr[min]){
min = i;
}
if (arr[i] > arr[max]){
max = i;
}
}
swap(arr, left, min);
if (left == max){//如果在一次循环中,最大值刚好是最左边的元素,那么交换后的最大值下标就是min了,所以将min赋值给最大值的下标即可
System.out.println(arr[left]);
max = min;
}
swap(arr, right, max);
left++;
right--;
}
}
相关文章推荐
- 【数据结构与算法】【排序】简单选择排序的代码实现
- 数据结构基础算法整理归纳:选择排序(四)
- 【数据结构与算法】内部排序之二:冒泡排序和选择排序(改进优化,附完整源码)
- javascript数据结构与算法--基本排序算法(冒泡、选择、排序)及效率比较
- <三>java数据结构与算法 选择排序
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
- 数据结构与算法一:选择排序
- Java数据结构与算法之选择排序_动力节点Java学院整理
- 数据结构与算法-选择排序
- 看数据结构写代码(2) 选择排序 和 冒泡排序 算法优化
- 【数据结构与算法】内部排序之二:冒泡排序和选择排序(改进优化,附完整源码)
- Java数据结构及算法实例:选择排序 Selection Sort
- 数据结构与算法:C++实现选择排序
- 数据结构与算法之--简单排序:冒泡、选择和插入
- 【数据结构与算法】选择排序
- 数据结构算法之排序系列Java、C源码实现(3)--直接选择排序
- 数据结构与算法学习:选择排序
- C语言学习历程(十七)数据结构与排序(冒泡、选择、希尔排序)算法
- 【数据结构与算法】选择排序
- 数据结构与算法——冒泡排序、选择排序和快速排序