简单插入排序
2017-10-04 18:32
197 查看
输入: 待排序的整型数组, 输出: 排序完毕的整型数组.
排序方法: 按照从小到大排序.
数组下标0, 不存放元素, 用作哨兵或其它用途.
实现思路:
把整个数组元素分成2部分, 已排序好的元素和未排序好的元素, 每次把未排序中
的元素, 拿出一个放在已排序好的元素中恰当的位置, 循环到最后, 即完成排序.
初始状态, 数组下标1, 也就是第1个元素, 就是已排好序的元素, [2, maxsize],
这部分数组元素就是未排好序的元素. 第1层循环, i在[2, maxsize-1], 第2层循环,
就是遍历已排序好的元素,j的范围是[i-1, 1]之间(递减), 之后两两比较并交换即可完成排序.
完整实现代码如下:
#include <stdio.h> #include <stdlib.h> #include <time.h> void getRandomArr (int arr[], int n); void printArr (int arr[], int n); void swap (int arr[], int i, int j); void insertSort (int arr[], int n); int main () { int max = 6; // 数组长度 int sortArr[max]; // 待排序数组 getRandomArr(sortArr, max); // 为待排序数组, 赋值 printf("待排序的元素如下: \n"); printArr(sortArr, max); printf("排序完毕的元素如下(从小到大): \n"); insertSort(sortArr, max); printArr(sortArr, max); return 0; } // 函数功能: 对主程序中的数组进行, 随机数赋值 // 参数: arr[] 主程序数组名称, n 数组大小 void getRandomArr (int arr[], int n) { int i; arr[0] = 0; // 默认0号下标, 值为0 srand(time(0)); // 随机数种子 for (i=1; i<n; i++) { arr[i] = rand() % 150 + 1; // 范围[1, 150] } } // 函数功能: 打印数组 // 参数: arr[] 需要打印的数组, n 数组大小 void printArr (int arr[], int n) { int i; for (i=0; i<n; i++) { printf("arr[%d]: %d\n", i, arr[i]); } printf("\n"); } // 函数功能: 交换数组i和j下标的2个元素 void swap (int arr[], int i, int j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } // 函数功能: 完成对arr[]的排序 // 参数: arr[] 待排序的数组, n该数组的长度 void insertSort (int arr[], int n) { int i; int j; for (i=2; i<n; i++) { // 如果刚开始i > i-1, 则该元素就是本次最大值, 不用移动 if (arr[i] > arr[i-1]) { continue; } for (j=i-1; j>=1; j--) { // 遍历已经排好序的元素 // 进行两两比较, 并交换 if (arr[j+1] < arr[j]) { swap(arr, j, j+1); } } // printArr(arr, n); } }
相关文章推荐
- 排序大全【各种排序】:直接插入,折半插入,冒泡,快排,简单选择,堆排序,归并排序
- 从零开始_学_数据结构(六)——排序(冒泡、插入、希尔、简单选择、归并、快速)
- 简单选择、冒泡、插入排序思想及Java实现代码
- 简单排序——冒泡,选择,插入
- 简单排序算法:直接插入排序(插入排序)
- 神的规范:排序算法(一):简单插入排序
- 直接插入排序的最简单实现
- set简单用法2 带排序的插入
- 直接插入排序 一个简单示例
- 排序之简单插入排序(数组)
- C++实现简单插入排序
- 简单插入排序
- java简单插入排序实例
- 数据结构 三种简单的排序(插入、选择、冒泡)
- 简单排序-冒泡排序/简单选择排序/直接插入排序算法
- 简单排序——冒泡,选择,插入
- 简单排序:冒泡排序、直接插入排序、直接选择排序
- 简单插入排序
- 排序算法之简单插入排序
- C语言描述——简单插入排序