直接插入排序和简单选择排序

11 篇文章 0 订阅

简单选择排序的思想:
简单选择排序的基本思想是每一趟在 n-i+1个记录中选取关键字最小的记录作为有序序列的第i个记录

直接插入排序思想:
基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录加1的有序表。

两者都是第二for循环都是不断查找,一个是不断往后找,一个在当前i,不断往前找。
简单选择排序,就是在当前选择i的时候,从后序的n-i+1个记录中查找最小的那个数,插入当前位置。

 // 简单选择排序: 每一趟在n-i+1个记录中选择关键字最小的记录 作为有序序列的第i个记录。
        public void SelectSort(int[] nums)
        {
            int i,j,min;

            for(i = 0;i<nums.length;i++)
            {
                min = i;   //每一次插入
                for(j = i+1;j<nums.length;j++) //都从后续的序列中找到最小的min
                {
                    if(nums[min]>nums[j])
                        min = j;
                }
                if(i!=min){                 // i!=min  即找到,否则 当前最小
                    swap(nums,i,min);
                }
            }

            prints(nums);
        }

直接插入查找,就是当前i位置时,不断往前找一个合适的(已经有序的位置插入).
int temp = nums[i],
for(j = i-1;j>=0;j–)
if(nums[j]>temp)
nums[j+1] = nums[j];//移动元素
else
break; //找到当前j 是小于 i位置的一个元素,所以插入nums[j+1] = temp;

// 直接插入排序
        public void InsertSort(int[] s){

            int i,j;
            for(i = 1;i<s.length;i++)
            {
                int temp = s[i];  // 存下当前的数
                for(j = i-1;j>=0;j--)
                {
                    if(s[j]>temp)
                    {
                        s[j+1] = s[j];// 大于temp的数后移
                    }else{
                        break;
                    }
                }
                // 插入
                s[j+1] = temp;
            }
            prints(s);
        }

不同:很容易弄混.把直接插入排序,当成简单选择排序,
因名知意,选择就是从后选择,选择最小的元素,插入当前位置。
而插入排序,则是找个合适的位置,插入,具体怎么插入,怎么移动。从这方面思考。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是你的第一个问题,让我来回答它。 首先,提供一个基于顺序表的程序,实现直接插入排序简单选择排序算法。以下是代码: ```c #include <stdio.h> #include <stdlib.h> #define MAXSIZE 10 // 定义最大长度 typedef struct { int r[MAXSIZE + 1]; // 顺序表存储的数组,r[0]不使用 int length; // 顺序表的长度 } SqList; // 交换函数 void swap(SqList *L, int i, int j) { int temp = L->r[i]; L->r[i] = L->r[j]; L->r[j] = temp; } // 直接插入排序 void InsertSort(SqList *L) { int i, j; for (i = 2; i <= L->length; i++) { if (L->r[i] < L->r[i-1]) { L->r[0] = L->r[i]; // 设置哨兵 for (j = i-1; L->r[j] > L->r[0]; j--) { L->r[j+1] = L->r[j]; // 记录后移 } L->r[j+1] = L->r[0]; // 插入到正确位置 } } } // 简单选择排序 void SelectSort(SqList *L) { int i, j, min; for (i = 1; i < L->length; i++) { min = i; for (j = i+1; j <= L->length; j++) { if (L->r[j] < L->r[min]) { min = j; // 记录最小值位置 } } if (i != min) { swap(L, i, min); // 交换 } } } // 菜单选项 void menu() { printf("1. 输入数据\n"); printf("2. 选择排序方式\n"); printf("3. 排序输出\n"); printf("0. 退出程序\n"); } // 数据输入 void InputData(SqList *L) { int i; printf("请输入%d个整数:\n", L->length); for (i = 1; i <= L->length; i++) { scanf("%d", &L->r[i]); } } // 排序方式选择 void SortSelect(SqList *L) { int choice; printf("请选择排序方式(1: 直接插入排序,2: 简单选择排序):"); scanf("%d", &choice); switch (choice) { case 1: InsertSort(L); printf("直接插入排序完成!\n"); break; case 2: SelectSort(L); printf("简单选择排序完成!\n"); break; default: printf("输入错误!\n"); break; } } // 排序输出 void OutputData(SqList L) { int i; printf("排序后的结果为:\n"); for (i = 1; i <= L.length; i++) { printf("%d ", L.r[i]); } printf("\n"); } int main() { SqList L; L.length = MAXSIZE; while (1) { menu(); int choice; printf("请输入选项:"); scanf("%d", &choice); switch (choice) { case 1: InputData(&L); break; case 2: SortSelect(&L); break; case 3: OutputData(L); break; case 0: exit(0); default: printf("输入错误!\n"); break; } } return 0; } ``` 该程序中,我们使用了一个结构体 `SqList` 来表示顺序表,其中包含了一个数组 `r` 和一个整数 `length`,分别表示存储的数据和长度。 我们实现了两个排序算法:直接插入排序简单选择排序。其中,直接插入排序的时间复杂度为 $O(n^2)$,简单选择排序的时间复杂度也为 $O(n^2)$。在实际使用中,简单选择排序的性能常常优于直接插入排序。 除此之外,我们还实现了菜单选项、数据输入、排序方式选择和排序输出等功能。最终的程序可以通过用户输入不同的选项来实现不同的功能,从而达到了交互的效果。 希望这个程序能够对你有所帮助。如果你有任何问题或建议,欢迎提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值