----------------
排序
----------------
冒泡排序思想:
“比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。”
选择排序思想:
“从头至尾扫描序列,找出最小的一个元素,和第一个元素交换,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序序列。
直接插入排序思想:
“直接插入排序的基本操作是将一个记录插到已排队好的有序表中,从而得到一个新的,记录增1的有序表。(第一个有序表可认为是第一个元素)“
希尔排序思想:
先取一个小于n的整数d
1作为第一个增量,把文件的全部记录分成d
1个组。所有距离为d
l的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d
2<d
1重复上述的分组和排序,直至所取的增量d
t=1(d
t<d
t-l<…<d
2<d
1),即所有记录放在同一组中进行直接插入排序为止。
该方法实质上是一种分组插入方法。
该方法实质上是一种分组插入方法。
堆排序思想:
待实现
归并排序思想:
待实现
快速排序思想;
测试主函数
1 #include <stdio.h> 2 #include<stdlib.h> 3 #include <time.h> 4 #include "sort.h" 5 6 7 int main() 8 { 9 ArrayList numlist; 10 PtArrayList pt_arraylist; 11 pt_arraylist = &numlist; 12 while(True){ 13 Init_Data(pt_arraylist); 14 show((char *)"排序前 ", pt_arraylist); 15 16 // BubbleSort_Low(pt_arraylist); 17 // BubbleSort_Mid(pt_arraylist); 18 // BubbleSort_Mid_Opt(pt_arraylist); 19 // SelectSort_Asc(pt_arraylist); 20 // SelectSort_Desc(pt_arraylist); 21 // InsertSort(pt_arraylist); 22 // ShellSort(pt_arraylist); 23 // QuickSort(pt_arraylist, 0, pt_arraylist->len-1); 24 QuickSort_Opt(pt_arraylist, 0, pt_arraylist->len-1); 25 show((char *)"排序后 ", pt_arraylist); 26 } 27 28 29 return 0; 30 }
测试头文件
1 //sort.h 2 #define True 1 3 #define False 0 4 #define NUMSIZE 20 5 typedef struct { 6 int array[NUMSIZE]; 7 int len; 8 }ArrayList, *PtArrayList; 9 10 void swap(int * first, int * second); 11 void show(char * info, PtArrayList * pt_arraylist); 12 void Init_Data(PtArrayList pt_arraylist); 13 void BubbleSort_Low(PtArrayList * pt_arraylist); 14 void BubbleSort_Mid(PtArrayList * pt_arraylist); 15 void BubbleSort_Mid_Opt(PtArrayList pt_arraylist); 16 void SelectSort_Asc(PtArrayList pt_arraylist); 17 void SelectSort_Desc(PtArrayList pt_arraylist); 18 void InsertSort(PtArrayList pt_arraylist); 19 void ShellSort(PtArrayList pt_arraylist); 20 int FindPos(PtArrayList pt_arraylist, int low, int high); 21 void QuickSort(PtArrayList pt_arraylist, int low, int high); 22 23 #include "sort_function.cpp"
函数具体实现
1 //sort_function.cpp 2 void Init_Data(PtArrayList pt_arraylist) 3 { 4 char s[] = "请输入不大于20的序列长度"; 5 printf("%s___\b\b",s); 6 while(!scanf("%d", &pt_arraylist->len) || (pt_arraylist->len > NUMSIZE)) 7 { 8 printf("%s\n",s); 9 if(pt_arraylist->len > NUMSIZE) 10 { 11 printf("当前序列长度为%d 过长\n", pt_arraylist->len); 12 continue; 13 } 14 scanf("%*s"); 15 } 16 17 srand(time(0)); //随机初始化rand()函数 18 for(int i=0; i<pt_arraylist->len; i++) 19 { 20 pt_arraylist->array[i] = rand()%200-100; 21 } 22 23 } 24 25 void QuickSort_Opt(PtArrayList pt_arraylist, int low, int high) 26 { 27 //快速排序--尾递归优化 28 int pos; 29 while(low<high) 30 { 31 pos = FindPos(pt_arraylist, low, high); 32 QuickSort(pt_arraylist, low, pos-1