zoukankan      html  css  js  c++  java
  • 数据结构与算法-选择排序与插入排序

    简单选择排序算法

    算法核心

    遍历找到每轮次的最小值,和待插入位置的数据进行交换,从而依次按照数组位置从小到大排好序。

    算法实现

    • 两层循环
    • 外层正序,从0到数组length-2(因为从0到倒数第二个都有序了,最后一个不需要判断)
    • 内层正序,从i到length-1(找到最小值)

    记忆口诀

    外层正序,内层正序,每轮找到最小并交换,依序排好

    C实现

    #include <stdio.h>
    #include <cstring>
    #include <cstdlib>
    
    #define MAXSIZE 100000
    
    typedef struct {
        int r[MAXSIZE];
        int length;
    } SqList;
    
    /**
     * 交换函数
     * @param list
     * @param i
     * @param j
     */
    void swap(SqList *list, int i, int j) {
        int tmp = list->r[i];
        list->r[i] = list->r[j];
        list->r[j] = tmp;
    }
    
    
    /**
     * 简单选择排序
     * @param list
     */
    void SelectSort(SqList *list) {
        for (int i = 0; i < list->length - 1; ++i) {
            int minIndex = i;
            for (int j = i; j < list->length; ++j) {
                if (list->r[j] < list->r[minIndex]) {
                    minIndex = j;
                }
            }
            if (minIndex != i) {
                swap(list, minIndex, i);
            }
        }
    }
    
    int main() {
        SqList sqList = SqList();
        //初始化赋值
        for (int i = 0; i < MAXSIZE; ++i) {
            sqList.r[i] = rand();
        }
        sqList.length = MAXSIZE;
        
        SelectSort(&sqList);
    
        for (int i = 0; i < MAXSIZE; ++i) {
            printf("%d
    ", sqList.r[i]);
        }
    }
    

    插入排序

    算法核心

    假设当前位置数据前面的序列已经有序,向前找到应该插入的位置,插入位置的所有有序数字依次后移一位,在待插入的位置插入当前数据。

    算法实现

    • 两层循环
    • 外层循环从i=1开始,到最后一个数结束(假设第一个位置已经有序;假如前面都有序了,也不代表最后一个不需要判断了)
    • 内层循环 从前往后,依次比较,找到待插入位置

    记忆口诀

    外层正序,内层正序找到位置,有序数据依次后移,最后插入到有序数组的合理位置

    C实现

    #include <stdio.h>
    #include <cstring>
    #include <cstdlib>
    
    #define MAXSIZE 100000
    
    typedef struct {
        int r[MAXSIZE];
        int length;
    } SqList;
    
    /**
     * 交换函数
     * @param list
     * @param i
     * @param j
     */
    void swap(SqList *list, int i, int j) {
        int tmp = list->r[i];
        list->r[i] = list->r[j];
        list->r[j] = tmp;
    }
    
    
    /**
     * 直接插入排序
     * @param list
     */
    void InsertSort(SqList *list) {
        for (int i = 1; i < list->length; ++i) {
            //待插入位置
            int insertIndex = 0;
            while (list->r[i] > list->r[insertIndex] && insertIndex < i) {
                insertIndex++;
            }
    
            if (insertIndex < i) {
                int data = list->r[i];
                for (int j = i - 1; j >= insertIndex; j--) {
                    list->r[j + 1] = list->r[j];
                }
                list->r[insertIndex] = data;
            }
        }
    }
    
    int main() {
        SqList sqList = SqList();
        //初始化赋值
        for (int i = 0; i < MAXSIZE; ++i) {
            sqList.r[i] = rand();
        }
        sqList.length = MAXSIZE;
    
        InsertSort(&sqList);
    
        for (int i = 0; i < MAXSIZE; ++i) {
            printf("%d
    ", sqList.r[i]);
        }
    }
    
  • 相关阅读:
    接口的基本语法
    包和访问权限(三)
    包和访问权限(二)
    包和访问权限(一)
    为什么用抽象类
    html5,单击显示详细信息
    html5,格式的验证
    html5,加密元素
    html5,新增的元素,fieldset legend
    html5,进度条
  • 原文地址:https://www.cnblogs.com/ging/p/13490509.html
Copyright © 2011-2022 走看看