直接插入排序(改进算法)
程序代码:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define MAXSIZE 6 typedef int RedType; struct SqList { RedType r[MAXSIZE + 1]; int length; }; void InitList(struct SqList* L) { L->length = 0; } void InsertList(struct SqList* L,RedType x) { L->r[L->length+1] = x; L->length++; } void PrintList(struct SqList* L) { for (int i = 1; i <= L->length; i++) { printf("%d\t", L->r[i]); } } void InsertSort(struct SqList* L) { for (int i = 2; i <= L->length; ++i) { L->r[0] = L->r[i]; int j = i - 1; while (L->r[0] < L->r[j]) { L->r[j+1] = L->r[j]; --j; } L->r[j+1] = L->r[0]; } } int main() { struct SqList* L = (struct SqList*)malloc(sizeof(struct SqList)); InitList(L); printf("请依次输入%d个数据:\n", MAXSIZE); for (int i = 0; i < MAXSIZE; i++) { int t; scanf("%d", &t); InsertList(L, t); } printf("原顺序:\n"); PrintList(L); printf("\n下面开始插入排序\n"); InsertSort(L); printf("排序结果如下:\n"); PrintList(L); } |
运行截图:
折半插入排序
程序代码:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define MAXSIZE 6 typedef int RedType; struct SqList { RedType r[MAXSIZE + 1]; int length; }; void InitList(struct SqList* L) { L->length = 0; } void InsertList(struct SqList* L, RedType x) { L->r[L->length + 1] = x; L->length++; } void PrintList(struct SqList* L) { for (int i = 1; i <= L->length; i++) { printf("%d\t", L->r[i]); } } void BInsertSort(struct SqList* L) { for (int i = 2; i <= L->length; ++i) { L->r[0] = L->r[i]; int low = 1; int high = i - 1; while (low <= high) { int mid = (low + high) / 2; if (L->r[0] < L->r[mid]) { high = mid - 1; } else { low = mid + 1; } } for (int j = i - 1; j >= low; j--) { L->r[j + 1] = L->r[j]; } L->r[low] = L->r[0]; } } int main() { struct SqList* L = (struct SqList*)malloc(sizeof(struct SqList)); InitList(L); printf("请依次输入%d个数据:\n", MAXSIZE); for (int i = 0; i < MAXSIZE; i++) { int t; scanf("%d", &t); InsertList(L, t); } printf("原顺序:\n"); PrintList(L); printf("\n下面开始折半插入排序\n"); BInsertSort(L); printf("排序结果如下:\n"); PrintList(L); } |
运行截图:
冒泡排序(改进算法)
程序代码:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define MAXSIZE 6 typedef int RedType; struct SqList { RedType r[MAXSIZE + 1]; int length; }; void InitList(struct SqList* L) { L->length = 0; } void InsertList(struct SqList* L, RedType x) { L->r[L->length + 1] = x; L->length++; } void PrintList(struct SqList* L) { for (int i = 1; i <= L->length; i++) { printf("%d\t", L->r[i]); } } void BubbleSort(struct SqList* L) { int boolen = 1; int i = 1; int temp; while(i<L->length&&boolen){ for (int j = L->length; j >i; j--) { if (L->r[j - 1] > L->r[j]) { temp = L->r[j]; L->r[j] = L->r[j - 1]; L->r[j - 1] = temp; boolen = 1; } } i++; } } int main() { struct SqList* L = (struct SqList*)malloc(sizeof(struct SqList)); InitList(L); printf("请依次输入%d个数据:\n", MAXSIZE); for (int i = 0; i < MAXSIZE; i++) { int t; scanf("%d", &t); InsertList(L, t); } printf("原顺序:\n"); PrintList(L); printf("\n下面开始冒泡排序\n"); BubbleSort(L); printf("排序结果如下:\n"); PrintList(L); } |
运行截图:
快速排序
程序代码:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define MAXSIZE 6 typedef int RedType; struct SqList { RedType r[MAXSIZE + 1]; int length; }; void InitList(struct SqList* L) { L->length = 0; } void InsertList(struct SqList* L, RedType x) { L->r[L->length + 1] = x; L->length++; } void PrintList(struct SqList* L) { for (int i = 1; i <= L->length; i++) { printf("%d\t", L->r[i]); } } int Partition(struct SqList* L, int low, int high) { L->r[0] = L->r[low]; int pivotkey = L->r[low]; while (low < high) { while (low<high && L->r[high] >= pivotkey) { --high; } L->r[low] = L->r[high]; while (low < high && L->r[low] <= pivotkey) { ++low; } L->r[high] = L->r[low]; } L->r[low] = L->r[0]; return low; } void QuickSort(struct SqList* L,int low,int high) { if (low < high) { int pivotloc = Partition(L, low, high); QuickSort(L, low, pivotloc - 1); QuickSort(L, pivotloc + 1, high); } } int main() { struct SqList* L = (struct SqList*)malloc(sizeof(struct SqList)); InitList(L); printf("请依次输入%d个数据:\n", MAXSIZE); for (int i = 0; i < MAXSIZE; i++) { int t; scanf("%d", &t); InsertList(L, t); } printf("原顺序:\n"); PrintList(L); printf("\n下面开始快速排序\n"); QuickSort(L,1,L->length); printf("排序结果如下:\n"); PrintList(L); } |
运行截图:
两路归并排序
程序代码:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define MAXSIZE 6 typedef int RedType; struct SqList { RedType r[MAXSIZE+1]; int length; }; void InitList(struct SqList* L) { L->length = 0; } void InsertList(struct SqList* L, RedType x) { L->r[L->length+1] = x; L->length++; } void PrintList(struct SqList* L) { for (int i = 1; i <= L->length; i++) { printf("%d\t", L->r[i]); } } void Merge(RedType InitList[], int left, int right, RedType MergedList[]) { int i, j, k, mid; mid = (left + right) / 2; i = left; j = mid + 1; k = left; while (i <= mid && j <= right) { if (InitList[i] <= InitList[j]) { MergedList[k++] = InitList[i++]; } else { MergedList[k++] = InitList[j++]; } } while (i <= mid) MergedList[k++] = InitList[i++]; while (j <= right) MergedList[k++] = InitList[j++]; } void MSort(RedType InitList[],int left,int right,RedType MergedList[]){ RedType TempList[MAXSIZE+1]; int mid; if (left == right) MergedList[left] = InitList[left]; else { mid = (left + right) / 2; MSort(InitList, left, mid, TempList); MSort(InitList, mid + 1, right, TempList); Merge(TempList, left, right, MergedList); } } void MergeSort(struct SqList* L) { MSort(L->r, 1, L->length, L->r); } void main() { struct SqList* L = (struct SqList*)malloc(sizeof(struct SqList)); InitList(L); printf("请依次输入%d个数据:\n", MAXSIZE); for (int i = 0; i < MAXSIZE; i++) { int t; scanf("%d", &t); InsertList(L, t); } printf("原顺序:\n"); PrintList(L); printf("\n下面开始归并排序\n"); MergeSort(L); printf("排序结果如下:\n"); PrintList(L); } |
运行截图:
实验小结
运用“哨兵”优化算法
“哨兵”是在循环或迭代算法中用来标志终止条件的值。哨兵查找算法的思路大致如下:
首先,判断0号下标元素是否和目标值相同,如果相同,直接返回0;如果不同,则我们将0号下标元素先保存起来,然后将目标值放到0号下标处;
然后,我们从后向前查找,如果和目标值相同,则结束循环,否则向前走。当下标为0时,会结束循环,因为0号下标是目标值;
查找完毕后,我们将前面保存的0号下标的值再还原回去;
最后判断是否大于0,如果大于0表示找到了,否则就是没找到。
归并排序的递归算法
将InitList[]中的记录用归并法排序后放在MergedList[]中,可分为下面三个步骤:
1.现将InitList[]中的前半段记录用归并法排序后放在TempList[]的前半段中。
2.再将InitList[]中的后半段记录用归并法排序后放在TempList[]的后半段中。
3.将TempList的前半段和后半段记录合并到MergedList[]中。