排序 2选择排序
300 Words|Read in about 2 Min|本文总阅读量次
经典的排序算法,选择排序
0准备
1//建立一个排序用的顺序表结构L
2#define MAXSIZE 9
3typedef struct SqList
4{
5 int r[MAXSIZE];
6 int length;
7}SqList;
8/*排序的交换函数*/
9void swap(SqList* L,int i,int j)
10{
11 int temp = L->r[i];
12 L->r[i] = L->r[j];
13 L->r[j] = temp;
14}
1选择排序(SelectSort)
选择排序的思想其实和冒泡排序有点类似,选择排序可以看成冒泡排序的优化。
- 首先,找到数组中最大(小)的那个元素:
- 其次,将它和数组的第一个元素交换位置(如果第一个元素就是最大(小)元素那么它就和自己交换)
- 再次,在剩下的元素中找到最大(小)的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序
这种方法叫做选择排序,因为它在不断地选择刺余元素之中的最大(小)者。
C的版本
1void SelectSort(SqList *L)
2{
3 int i,j;
4 for(i = 0; i < L->length - 1; i++)
5 {
6 int min = i;
7 for(j = i + 1; j < L->length; j++)
8 {
9 if(L->r[j] < L->r[min])
10 {
11 min = j;
12 }
13 }
14 if(i != min)/**需要判断i和min,减少交换次数*/
15 {
16 swap(L, i, min);
17 }
18 }
19}
i = 0
的时候
i = 1
的时候
i = 2
的时候
i = 3
的时候
i = 4
的时候
i = 5
的时候
i = 6
的时候
i = 7
的时候
Java版本
1public int[] SelectSort(int[] nums){
2 if(0 == nums.length)
3 {
4 return nums;
5 }
6 for(int i = 0; i < nums.length; i++)
7 {
8 //最小数的下标。每个循环开始总假设第一个数最小
9 int minIndex = i;
10 for(int j = i; j < nums.length; j++)
11 {
12 if(nums[j] < nums[minIndex])
13 {
14 //保存最小值的索引
15 minIndex = j;
16 }
17 }
18 System.out.Println("最小数为:" + nums[minIndex]);
19 //交换最小数和i当前所指的下标
20 int tmp = nums[minIndex];
21 nums[minIndex] = nums[i];
22 nums[i] = tmp;
23 }
24 return nums;
25}