c语言实现直接插入排序(正序和逆序)
2015-09-07 09:03
411 查看
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
插入排序的基本思想是:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
插入排序的基本思想是:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
#include<stdio.h> struct DataType { int data; }; struct Sqlist { DataType R[20]; int length; }; //直接插入排序(从小到大) void Sort(Sqlist *l) { int j; for(int i=2;i<=l->length;i++) { //如果后一个数小于前一个数,则开始排序 if(l->R[i-1].data > l->R[i].data) { l->R[0] = l->R[i];//置小数为哨点 j = i-1; //从前一个数开始与哨点 while(l->R[j].data > l->R[0].data) { l->R[j+1] = l->R[j];//向后移动数据 j--; } l->R[j+1] = l->R[0]; } } } //直接插入排序(从大到小) void U_Sort(Sqlist *l) { int i,j; for(i=2;i<=l->length;i++) { //如果后一个数大于前一个数,则开始排序 if(l->R[i].data > l->R[i-1].data ) { l->R[0] = l->R[i];//置较大数为哨点 j = i-1; //如果前一个数小于R[0],则数据后移 while(l->R[j].data < l->R[0].data) { l->R[j+1] = l->R[j]; j--; } l->R[j+1] = l->R[0]; } } } int main() { Sqlist list; list.length = 10; int data[10] = {3,1,5,6,4,8,1,9,10,2}; //初始化数据 for(int i=1;i<= list.length;i++) { list.R[i].data = data[i-1]; } Sort(&list); //从小到大排序 for(int i=1;i<= list.length;i++) { printf("%d ",list.R[i].data); } U_Sort(&list); printf("\n"); //从大到小排序 for(int i=1;i<= list.length;i++) { printf("%d ",list.R[i].data); } printf("\n"); }
相关文章推荐
- 2015.09.06 C++笔记
- C语言的isatty函数和ttyname函数以及sendmsg函数用法
- C++ 虚函数表解析
- 浅谈C++中的重载、覆盖(重写)、隐藏
- HDU 2024 C语言合法标识符(水~)
- C++相对于C的两种新的内置类型
- C++ Primer : 第十四章 : 重载运算与类型转换之重载运算符
- 队列的链式实现(C语言)
- C&C++输入方法总结
- 浅谈C++中的单例模式
- C语言 常量
- C++ template overload
- C语言数据类型总结
- C++ 类型转换笔记
- C++学习笔记【转载】
- C++ 重载操作符之一(指针运算符*,->)
- C语言内存分配情况详解
- C/C++基础知识:typedef用法小结
- 快速判断一个数能否被1、2、3、4、5、6、7、8、9、10、11、12、13、17、19、23等整除的规律总结
- C++ 多态,虚函数