查看“︁选择排序”︁的源代码
←
选择排序
跳转到导航
跳转到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
{{Unreferenced|time=2019-12-16T10:32:19+00:00}} {{NoteTA |G1 = IT }} {{算法信息框 |class=[[排序算法]] |image=[[File:Selection sort animation.gif|none|288px|選擇排序動畫演示]] |data=[[數組]] |time=<math>O(n^2)</math> |best-time=<math>O(n^2)</math> |average-time=<math>O(n^2)</math> |space=總共<math>O(n)</math>,需要輔助空間<math>O(1)</math> |optimal= 偶尔出现 }} [[Image:Selection-Sort-Animation.gif|right|thumb|选择排序的示例动画。红色表示当前最小值,黄色表示已排序序列,蓝色表示当前位置]] '''选择排序'''({{lang-en|Selection sort}})是一种简单直观的[[排序算法]]。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对<math> n </math>个元素的表进行排序总共进行至多<math> (n-1) </math>次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。 ==實作範例== ===C语言=== <syntaxhighlight lang="c" line="1"> void selection_sort(int a[], int len) { int i,j,temp; for (i = 0 ; i < len - 1 ; i++) { int min = i; for (j = i + 1; j < len; j++) //走訪未排序的元素 { if (a[j] < a[min]) //找到目前最小值 { min = j; //紀錄最小值 } } if(min != i) { temp=a[min]; //交換兩個變數 a[min]=a[i]; a[i]=temp; } /* swap(&a[min], &a[i]); */ //做交換 } } /* void swap(int *a,int *b) //交換兩個變數 { int temp = *a; *a = *b; *b = temp; } */ </syntaxhighlight> ===Java=== <syntaxhighlight lang="java" line="1"> public class SelectionSort { public void sort(int[] arr) { int minIndex; for(int i = 0;i < arr.length;i++) { minIndex = i; //遍历找出未排序中的元素中最小值下标 for(int j = i;j < arr.length;j++) { if(arr[j] < arr[minIndex]) { minIndex = j; } } //若最小值下标与未排序中最左侧下标不一致则交换 if(minIndex != i) { int temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } } } } </syntaxhighlight> ===[[Julia (程式語言)]]=== <syntaxhighlight lang="julia"> # Julia Sample:SelectionSort function SelectionSort(A) for i=1:length(A) min=i for j=i+1:length(A) min=A[j]<A[min]?j:nothing # Get Min if min!=i A[min],A[i]=A[i],A[min] # Swap end end end return A end # Main Code A = [16,586,1,31,354,43,3] println(A) # Original Array println(SelectionSort(A)) # Selection Sort Array </syntaxhighlight> === Python === <syntaxhighlight lang="python3" line="1" start="1"> def selection_sort(list1): longs = len(list1) for i in range(longs-1): idx = i for j in range(i, longs): if list1[j] < list1[idx]: idx = j if idx != i: list1[i], list1[idx] = list1[idx], list1[i] </syntaxhighlight> == 复杂度分析 == 选择排序的'''交换操作'''介于<math>0</math>和<math>(n-1)</math>次之间。选择排序的'''比较操作'''为<math>n(n-1)/2</math>次。选择排序的'''赋值操作'''介于<math>0</math>和<math>3(n-1)</math>次之间。 比较次数<math>O(n^2)</math>,比较次数与关键字的初始状态无关,总的比较次数<math>N=(n-1)+(n-2)+...+1=n\times(n-1)/2</math>。交换次数<math>O(n)</math>,最好情况是,已经有序,交换0次;最坏情况是,逆序,交换<math>n-1</math>次。交换次数比冒泡排序较少,由于交换所需CPU时间比比较所需的CPU时间多,<math>n</math>值较小时,选择排序比冒泡排序快。 原地操作几乎是选择排序的唯一优点,当空间复杂度要求较高时,可以考虑选择排序;实际适用的场合非常罕见。 == 外部链接 == {{wikibook|算法实现/排序/选择排序}} {{排序算法表}} {{算法}} [[Category:排序算法]]
该页面使用的模板:
Template:Lang-en
(
查看源代码
)
Template:NoteTA
(
查看源代码
)
Template:Unreferenced
(
查看源代码
)
Template:Wikibook
(
查看源代码
)
Template:排序算法表
(
查看源代码
)
Template:算法
(
查看源代码
)
Template:算法信息框
(
查看源代码
)
返回
选择排序
。
导航菜单
个人工具
登录
命名空间
页面
讨论
不转换
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
特殊页面
工具
链入页面
相关更改
页面信息