您的位置:首页 > 理论基础 > 数据结构算法

数据结构与算法之选择排序

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--;

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: