数据结构与算法-选择排序与插入排序

简单选择排序算法

算法核心

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

算法实现

  • 两层循环
  • 外层正序,从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]);
    }
}
原文地址:https://www.cnblogs.com/ging/p/13490509.html