目录
1. 直接插入排序
1.1 直接插入排序简介
1. 什么是直接插入排序
直接插入排序是一种最简单的排序方法,其基本操作是将需要排序的元素插入到已排好的有序表序列中,从而得到一个完整的有序序列
2. 排序思想
- 将待排序序列分为两部分,一部分有序一部分无序。
- 我们把第一个元素看作有序序列,从第二个元素到最后为无序序列。
- 将无序序列中每一个元素依次插入到有序序列的合适位置–从小到大(从大到小)。
1.2 排序实现
1. 排序代码
void insertsort(struct element a[],int n){ int i,j; struct element x; for(i=1;i<n;i++){ if(a[i].key<a[i-1].key) //反序时 { x=a[i]; j=i-1; do //找a[i].key的插入位置 { a[j+1]=a[j]; //将关键字大于a[i].key的记录后移 count1++; j--; move1++; }while(j>=0&&a[j].key>x.key); a[j+1]=x; //在j+1处插入a[i] move1=move1+2; } count1++; } }
2. 复杂度分析:
时间复杂度:最坏情况下为O(N*N),此时待排序列为逆序,或者说接近逆序
最好情况下为O(N),此时待排序列为升序,或者说接近升序。
空间复杂度:O(1)
3. 运行结果:
1.3 学习链接
2. 希尔排序(分组排序)
2.1 希尔排序简介
1. 什么是希尔排序
希尔排序是把序列按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量的逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个序列恰好被分为一组,算法便终止。
2.排序思想
- 将元素等分为n小组,元素较少时,元素一般以4开始,将组内元素进行排序,一般采取插入排序
- 排序完成之后,将元素再次分组(n/2组),组内元素再次排序
- 以此类推,当n==1时,排序完成
2.2 排序实现
1. 希尔排序代码
void shellsort(struct element a[],int n){ int i,j,k; struct element tmp; k=n/2; //增量置初值 while(k>0) { for(i=k;i<n;i++) //对所有组采用直接插入排序 { tmp=a[i]; //对相隔k个位置一组采用直接插入排序 j=i-k; while(j>=0&&tmp.key<a[j].key) { a[j+k]=a[j]; j=j-k; move2=move2+3; } a[j+k]=tmp; count2++; } k=k/2; //减小增量 } }
2. 复杂度分析
时间复杂度平均:O(N^1.3)
空间复杂度:O(1)