【数据结构与算法】十、排序-简单选择排序

定义

简单选择排序法(Simple Selection Sort) 就是通过 n-i 次关键字间的比较,从 n-i+1 个记录中选出关键字最小的记录,并和第 i(1≤i≤n)个记录交换之。

实现思路

  1. 确定排序区间:从第一个元素开始,依次将未排序区间中的最小值选出来。
  2. 查找最小值:每次在未排序区间(从当前位置到末尾)遍历,找到最小元素的下标。
  3. 交换位置:将找到的最小元素与当前排序区间的第一个元素交换。
  4. 重复步骤:每次确定一个元素的位置,直到所有元素有序。

代码实现

#include <stdio.h>

#define MAXSIZE 5
#define OK 1
#define ERROR 0

typedef struct {
  int array[MAXSIZE + 1]; /* 排序数组, array[0] 用作哨兵或临时变量 */
  int length;
} SqList;

void swap(SqList *L, int i, int j) {
  int temp = L->array[i];
  L->array[i] = L->array[j];
  L->array[j] = temp;
}
void SelectSort(SqList *L) {
  int i, j, minIndex;
  for (i = 1; i < L->length; i++) {
    minIndex = i;
    for (j = i + 1; j <= L->length; j++) {
      if (L->array[j] < L->array[minIndex])
        minIndex = j;
    }
    if (minIndex != i)
      swap(L, i, minIndex);
  }
}

int main(void) {
  SqList L;
  L.length = 5;
  L.array[1] = 5;
  L.array[2] = 4;
  L.array[3] = 3;
  L.array[4] = 2;
  L.array[5] = 1;

  printf("排序前:\n");
  for (int i = 1; i <= L.length; i++) {
    printf("%d ", L.array[i]);
  }
  printf("\n");

  SelectSort(&L);

  printf("排序后:\n");
  for (int i = 1; i <= L.length; i++) {
    printf("%d ", L.array[i]);
  }
  printf("\n");
  return 0;
}
排序前:
5 4 3 2 1 
排序后:
1 2 3 4 5 

[Done] exited with code=0 in 0.368 seconds

复杂度分析

第 i 次排序需要进行 n – i 次关键字的比较,需要比较 n-1 + n-2 +…+1 = n(n-1)/2 次。
对于交换次数而言,当最好的时候,交换为 0 次,最差的时候,也就初始降序时,交换次数为 n-1 次,加上比较时间,复杂度是O(n^2).


了解 Heiweilu的小世界 的更多信息

订阅后即可通过电子邮件收到最新文章。

💡本内容采用 CC BY-NC-SA 4.0 协议,非商业转载需注明作者和出处,商业用途请联系作者授权,衍生作品需采用相同协议。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇

了解 Heiweilu的小世界 的更多信息

立即订阅以继续阅读并访问完整档案。

继续阅读

🎵 背景音乐
点击播放
00:00 00:00