一步一步复习数据结构和算法基础-插入排序(1)
来源:互联网 发布:数据交换平台技术规范 编辑:程序博客网 时间:2024/06/05 04:05
插入排序的种类有很多,首先是最简单的直接插入排序;
直接插入排序:基本操作是将一个数据插入到已经排序好的数据里面;
#include<stdio.h>#include<stdlib.h>void InsertSort(int *array,int length){int i,k;for(i=2;i<=length;i++){if(*(array+i) < *(array+i-1)){//*array作为监视哨*array = *(array+i);*(array+i) = *(array+i-1);//数字后移,插入到正确的位置for(k=i-2;*array<*(array+k);k--)*(array+k+1) = *(array+k);*(array+k+1) = *array;}}}int main(){int i,length;int *array;scanf("%d",&length);array = (int*)malloc(sizeof(int)*(length+1));if(!array)exit(1);for(i=1;i<=length;i++)scanf("%d",array+i);InsertSort(array,length);for(i=1;i<=length;i++)printf("%d ",*(array+i));printf("\n");free(array);return 0;}
折半插入排序:减少比较次数的插入排序,但是时间复杂度不变
#include<stdio.h>#include<stdlib.h>void BInsertSort(int *array,int length){int i,k;int low,high,mid;for(i=2;i<=length;i++){low = 1;high=i-1;*array = *(array+i);//在数组中折半查找有序的位置while(low <= high){mid = (low+high)>>1;//折半if(*array < *(array+mid)) high = mid-1;//插入点在低半区else low = mid+1;//插入点在高半区}//后移for(k=i-1;k>=high+1;k--)*(array+k+1) = *(array+k);*(array+high+1) = *array;}}int main(){int i,length;int *array;scanf("%d",&length);array = (int*)malloc(sizeof(int)*(length+1));if(!array)exit(1);for(i=1;i<=length;i++)scanf("%d",array+i);BInsertSort(array,length);for(i=1;i<=length;i++)printf("%d ",*(array+i));printf("\n");free(array);return 0;}
现在在重新写一遍,加深印象
#include<stdio.h>#include<stdlib.h>#include<time.h>void insertsort(int array[],int length){int i,tmp,k;for(i=1;i<length;i++){tmp = array[i];for(k=i;k>0&&array[k-1]>tmp;k--)array[k] = array[k-1];array[k] = tmp;}}void bubblesort(int array[],int length){int i,k,tmp;for(i=0;i<length;i++){for(k=0;k<length-i-1;k++){if(array[k] > array[k+1]){tmp = array[k];array[k]=array[k+1];array[k+1]=tmp;}}}}void shellsort(int array[],int length){int i,k,tmp,increase;for(increase=length/2;increase >0;increase /= 2){for(i=increase;i<length;i++){tmp = array[i];for(k=i;k>=increase&&array[k-increase]>tmp;k-=increase)array[k] = array[k-increase];array[k] = tmp;}}}int main(){int i;int array[10];srand((unsigned)time(NULL));for(i=0;i<10;i++)array[i] = rand()%1000;shellsort(array,10);for(i=0;i<10;i++)printf("%d ",array[i]);printf("\n");return 0;}
- 一步一步复习数据结构和算法基础-插入排序(1)
- 一步一步复习数据结构和算法基础-插入排序(2)
- 一步一步复习数据结构和算法基础(1)
- 一步一步复习数据结构和算法基础-单链表冒泡排序
- 一步一步复习数据结构和算法基础-冒泡排序
- 一步一步复习数据结构和算法基础-快速排序
- 一步一步复习数据结构和算法基础-堆排序
- 一步一步复习数据结构和算法基础-二叉排序树
- 一步一步复习数据结构和算法基础-双链表
- 一步一步复习数据结构和算法基础-栈和队列(1)
- 一步一步复习数据结构和算法基础-链表(1)
- 一步一步复习数据结构和算法基础-栈的简单应用(1)
- 一步一步复习数据结构和算法基础-KMP算法
- 一步一步复习数据结构和算法基础--kruskal算法
- 一步一步复习数据结构和算法基础-Floyd算法
- 一步一步复习数据结构和算法基础-dijkstra算法
- 一步一步复习数据结构和算法基础-栈和队列(2)
- 一步一步复习数据结构和算法基础-链表(2)
- 实现客户端与服务器的交互
- 常用WEB框架Struts1、Struts2和Spring MVC大PK(二)(转)
- JSTL学习笔记
- 算法导论笔记之----合并排序
- Struts学习笔记
- 一步一步复习数据结构和算法基础-插入排序(1)
- java中字符流与字节流的区别
- su: Authentication failure 错误
- OpenID使用详解
- 平静心情五招
- RS一485接口电路的设计
- 经验是借口
- Hibernate 批量处理
- 童年