0%

数据结构c语言描述九-插入排序和希尔排序

插入排序

插入排序基于这样一种情况,待插入的数组是顺序的(升序或降序),此时将插入数据从数组从后向前比较,满足条件就插入,不满足就依次向后移动

插入排序就好象玩扑克时一张一张的拿牌,大的在左边,小的在右边,每拿一张牌就从右到左一次比较,在第一张大于的牌的右边插入新的扑克

插入算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef int ElementType;
void insertSort(ElementType* array,int len){
int arrayMaxIndex = len - 1;
int arrayMinIndex = 0;
int index = 0;
int j = 0;
for(index = arrayMinIndex + 1;index <= arrayMaxIndex;index++){
int insertValue = array[index];
for(j = index - 1;j >= 0 && array[j] > insertValue;j--){
array[j + 1] = array[j];
}
array[j + 1] = insertValue;
}
}

希尔排序

希尔排序通过比较相距一定间隔的元素来工作,将比较的元素按照大小排列到比较元素的位置,然后通过减小间隔再次比较,最后间隔为1时所有比较完成

希尔排序

最上面数据为未排序数据,由上往下增量依次为 5,3,1

希尔排序算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
typedef int ElementType;
void shellSort(ElementType* array,int increment,int len){
int arrayMinIndex = 0;
int arrayMaxIndex = len - 1;
int sortTime = 0;
int j = 0;
int insertValue = 0;
//当一趟的增量大于排序数组长度时进行的处理
if(increment > len){
shellSort(array,1,len);
}
for(;sortTime < increment;sortTime++){
//插入排序的变形
for(int i = sortTime + increment;i < len;i += increment){
insertValue = array[i];
for(j = i - increment;j >= arrayMinIndex && array[j] >= insertValue;j -= increment){
array[j + increment] = array[j];
}
array[j + increment] = insertValue;
}
}
}

参考源码