数据结构与算法-选择排序与插入排序
简单选择排序算法
算法核心
遍历找到每轮次的最小值,和待插入位置的数据进行交换,从而依次按照数组位置从小到大排好序。
算法实现
- 两层循环
- 外层正序,从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\n", 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\n", sqList.r[i]);
}
}