选择排序的算法和优化

正常的选择排序

选择排序是每一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

  分为三步:

  ①、从待排序序列中,找到关键字最小的元素

  ②、如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换

  ③、从余下的 N - 1 个元素中,找出关键字最小的元素,重复(1)、(2)步,直到排序结束

代码如下

 1 package com.ssm.排序算法;
 2
 3 public class 选择排序 {
 4     /**
 5      * 换位方法
 6      */
 7     public static void swap(int[] array, int x, int y) {
 8         int temp;
 9         temp = array[x];
10         array[x] = array[y];
11         array[y] = temp;
12     }
13
14     /**
15      * 排序方法
16      */
17     public static int[] sort(int[] array) {
18         for (int i = 0; i < array.length-1; i++) {
19                 int min = i;
20             for (int j = i+1; j < array.length; j++) {
21                   min = array[min]>array[j]? j:min;
22             }
23               if(min!=i){
24                   swap(array,min,i);
25               }
26         }
27         return array;
28     }
29
30     /**
31      * 遍历方法
32      *
33      * @param array
34      */
35     public static void display(int[] array) {
36         for (int i = 0; i < array.length; i++) {
37             System.out.print(array[i] + " ");
38         }
39         System.out.println();
40     }
41
42     public static void main(String[] args) {
43         int[] array = {4, 2, 8, 9, 5, 7, 6, 1, 3};
44         System.out.println("排序前的数组是:");
45         display(array);
46         System.out.println("---------------------------");
47         System.out.println("排序后的数组是:");
48         display(sort(array));
49     }
50 }

优化后的选择排序

这里优化的思路就是在每次循环找出最小值的时候同时找出最大值并排序,这样的话循环的次数就会少一半

核心代码如下

 1    /**
 2      * 排序方法
 3      */
 4     public static int[] sort(int[] array) {
 5
 6         //这样优化之后选择排序需要循环的次数直接缩减了一半
 7         for (int i = 0; i < (array.length/2); i++) {
 8             int maxLength = array.length - (i + 1);
 9             int min = i;
10             int max = maxLength;
11
12             for (int j = i + 1; j < array.length - i; j++) {
13                 min = array[min] > array[j] ? j : min;
14                 //每次循环都找出最大值和最小值
15                 max = array[max] < array[j] ? j : max;
16             }
17
18             if (min != i) {
19                 swap(array, min, i);
20             }
21
22             if (max != maxLength) {
23                 swap(array, max, maxLength);
24             }
25         }
26         return array;
27     }

验证选择排序的稳定性

原文地址:https://www.cnblogs.com/xiaowangtongxue/p/10703773.html

时间: 2024-10-10 09:44:44

选择排序的算法和优化的相关文章

选择排序---堆排序算法(Javascript版)

堆排序分为两个过程: 1.建堆. 堆实质上是完全二叉树,必须满足:树中任一非叶子结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字. 堆分为:大根堆和小根堆,升序排序采用大根堆,降序排序采用小根堆. 如果是大根堆,则通过调整函数将值最大的节点调整至堆根. 2.将堆根保存于尾部,并对剩余序列调用调整函数,调整完成后,再将最大跟保存于尾部-1(-1,-2,...,-i),再对剩余序列进行调整,反复进行该过程,直至排序完成. 以下代码在nodejs中执行通过 //调整函数function

选择排序---堆排序算法(Javascript版) 降序排列

//调整函数 function headAdjust(elements, pos, len){ //将当前节点值进行保存 var swap = elements[pos]; //定位到当前节点的左边的子节点 var child = pos * 2 + 1; //递归,直至没有子节点为止 while(child < len){ //如果当前节点有右边的子节点,并且右子节点较小的场合,采用右子节点 //和当前节点进行比较 if(child + 1 < len && elements

排序算法(三)冒泡、选择排序的Python实现及算法优化详解

说在前面 最近一年太忙,博客长草了.近日用Python实现了常用排序算法,供大家参考. Java版本排序算法及优化,请看以前的文章. <排序算法之简单排序(冒泡.选择.插入)> <排序算法(二)堆排序> 1.排序概念 这里不再赘述,请参看前面2篇文章 2.简单排序之冒泡法Python实现及优化 原理图 2.1.基本实现 num_list = [     [1, 9, 8, 5, 6, 7, 4, 3, 2],     [1, 2, 3, 4, 5, 6, 7, 8, 9] ] nu

排序算法(二)——选择排序

上篇博客介绍了冒泡算法,接下来介绍插入排序和选择排序. 选择排序; 算法思想:从无序序列中找到最大(或最小)元素,放在序列的最右边(或最左边). 代码如下: #include <iostream> using namespace std; void swap(int &a,int &b) { int temp=a; a=b; b=temp; return; } void Insert_sort(int list[],int begin,int end) { for(int i=

算法学习之排序算法:选择排序

选择排序:每一趟在n-i+1(i=1,2,...,n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录. 一.简单选择排序 一趟选择排序操作: 通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换之. 对L[1...n]中记录进行简单选择排序的算法为:令i从1至n-1,进行n-1趟选择操作.简单选择排序过程中,所需进行记录移动的操作次数较少,然而,无论记录的初始排列如何,所需关键字间的比较次数相同.因此,总的时间复杂度为O(n^2)

数据结构与算法之排序(2)选择排序 ——in dart

选择排序的算法复杂度与冒泡排序类似,其比较的时间复杂度仍然为O(N2),但减少了交换次数,交换的复杂度为O(N),相对冒泡排序提升很多.算法的核心思想是每次选出一个最小的,然后与本轮循环中的第一个进行比较,如果需要则进行交换. 1 import 'dart:math' show Random; 2 3 void main() { 4 final seed = 100, rnd = Random(), length = 100; 5 var list = 6 List<int>.generate

Java数据结构之排序---选择排序

简单选择排序的介绍: 从给定的序列中,按照指定的规则选出某一个元素,再根据规定交换位置后达到有序的目的. 简单选择排序的基本思想: 假定我们的数组为int [] arr = new int[n],第一次我们从arr[0]~arr[n-1]中选择出最小的值与arr[0]交换.第二次我们从arr[1]~arr[n-1]中选择出最小的值与arr[1]交换.第三次我们从arr[2]~arr[n-1]中选择出最小的值与arr[2]交换,...,第i次我们从arr[i-1]~arr[n-1]中选择出最小的值

数据结构之——选择排序

选择排序的基本思想为:每一趟(例如第i趟)在后面的n-i+1(i=1,2,3,…...,n-1)个待排序元素中选取关键字最小的元素,作为有序序列的第i个元素,直到n-1趟做完,待排序元素只剩下一个,就不用选了,序列也排序完毕.选择排序主要有简单选择排序和堆排序,下面分别就这两种排序算法进行讨论. 1.简单选择排序 从上面选择排序的思想中可以很直观的得出简单选择排序的算法思想:假设排序列表为L[1……n],第i趟排序从L[i……n]中选择关键字最小的元素与L(i)交换,每一趟排序可以确定一个元素的

数组排序之选择排序

??在刚开始学习数组时,不能很好的使用简单的排序算法,当进行深入学习了一段时间后,才分清楚,今天这里简单的分享一下使用选择排序的算法并进行相关实例. 1. 什么是选择排序? ??从字面意思可以理解,就是有选择的进行排序,那么什么是有选择的呢?按照我的理解,就是按照某一种规则(例如从大到小或者从小到大)进行排序,就好像我们去看美女,肯定是先找气质最好的,依次往下,当然按照气质来进行选择的话,这是一个判断条件,是我们的一个标准:而我们所学习的选择排序也是这样. 专业解释: ??选择排序是通过每一趟排