算法导论笔记1——插入排序

来源:互联网 发布:滁州学院网络教学平台 编辑:程序博客网 时间:2024/05/22 23:16

插入排序的基本思想是

每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止


插入排序的步骤:

将待插入记录R[i]的关键字从右向左依次与有序区中记录R[j](j=i - 1, i - 2, ....,1)的关键字比较:
  1. 若R[j]的关键字大于R[i]的关键字,则将R[j]后移一个位置
  2. 若R[j]的关键字小于或等于R[i]的关键字,则查找过程结束,j + 1即为R[i]插入位置
关键字比R[i]的关键字大的记录均已后移,所以j + 1的位置已经腾空,只要将R[i]直接插入到此位置即可完成一趟直接插入排序
C语言实现
/*<span style="white-space:pre"></span>功能:将p[n]插入到 p[0]到p[n-1] 当中<span style="white-space:pre"></span>参数p是数组,且前p[0]到p[n-1]是已经排好顺序的,<span style="white-space:pre"></span>参数n是要插入的数的下标*/void insert(int *p, int n){        int key = p[n];//要插入的数        int i = n-1;        while(i>=0)//循环遍历p[i]到p[0],找到要插入的位置        {                if(p[i]>key)//如果p[i]大于要插入的数,那么将p[i]向后移动一位                {                        p[i+1]=p[i];                        i--;                }                else{ //因为前面是有序的,所以不用再比较了                        break;                }        }        p[i+1] = key; // 插入结果}/*非递归实现*/void Insert_Sort(int* arr, int len){<span style="white-space:pre"></span>for(int i = 1; i<len; i++)<span style="white-space:pre"></span>{<span style="white-space:pre"></span>insert(arr,i);<span style="white-space:pre"></span>}}/*递归实现  功能:将arr数组中的,n+1个数排序  参数arr:数组  参数n:指示要排序的下标范围,0-n*/void recursive_Insert_Sort(int *arr, int n){<span style="white-space:pre"></span>if(n>0)<span style="white-space:pre"></span>{<span style="white-space:pre"></span>recursive_Insert_Sort(arr, n-1); //第一步将前n-1个排好顺序<span style="white-space:pre"></span>insert(arr, n);//第二步将arr[n]插入到前n-1个数中<span style="white-space:pre"></span>}}int main(int argc, char* argv[]){<span style="white-space:pre"></span>int arr[10] = {2,1,4,3,6,7,8,6,5,4};<span style="white-space:pre"></span>Insert_Sort(arr, 10);<span style="white-space:pre"></span>recursive_Insert_Sort(arr, 9);<span style="white-space:pre"></span>for(int i=0; i<10; i++)<span style="white-space:pre"></span>{<span style="white-space:pre"></span>printf("%d ", arr[i]);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>printf("\n");<span style="white-space:pre"></span>return 0;}

python实现
def Insert_Sort(arr):arr_len = len(arr)for i in range(1,arr_len):temp = arr[i]index = 0for j in range(0, i)[::-1]:if arr[j]>temp:arr[j+1] = arr[j]arr[j] = tempelse:breakif __name__ =="__main__":arr = [4,3,3,1,2];Insert_Sort(arr);print arr;

时间复杂度


当数组和要求排序的顺序相同时,为o(n)
当数组和要求排序的顺序相反时,为o(a(n *n)+b*n+c),a、b、c为常量
平均时间复杂度为o(n * n)



0 0
原创粉丝点击