printf(\请选择:\scanf(\getchar();
for(i=1;i<=L;i++) { R[i].key=S[i].key; }
switch(ch2) {
case '1': printf(\请输入%d个待排序数据\\n\\t\\t\ for(i=1;i<=L;i++) { scanf(\ getchar(); printf(\ } printf(\数据输入完毕!\ break; case '2': Insertsort(); break; case '3': Shellsort(); break; case '4': Bubblesort(); break; case '5': printf(\原始数据为(按回车键开始排序):\\n\\t\\t\ for(k=1;k<=L;k++) { printf(\ } getchar(); printf(\ num=0;sun=0;sum=0; Quicksort(1,L); printf(\排序最终结果是:\\n\\t\\t\ for(k=1;k<=L;k++) { printf(\ } printf(\比较次数是:%d\\n\\t\\t\
- 3 -
}
printf(\交换次数是:%d\\n\\t\\t\ break; case '6': Selectsort(); break; case '7': Heap(); break; case '8': Mergesort(); break; case '0': ch1='n'; break; default: system(\清屏 printf(\对不起,您输入有误,请重新输入!\\n\ break; } if(ch2!='0') { if(ch2=='2'||ch2=='3'||ch2=='4'||ch2=='5'||ch2=='6'||ch2=='7'||ch2=='8') { printf(\排序完毕!\ printf(\按回车键继续!\ q=getchar(); if(q!='\\n') { getchar(); ch1='n'; } } } }
return 1;
- 4 -
图一 主界面
4.1.1 冒泡排序 核心思想
依次比较相邻的两个数,将小数放在前面,大数放在后面,第一轮比较后,最大的数便被放到了最后;第二轮操作前n-1个数据(假设有n个数据),依然是依次比较相邻的两个数,将小数放在前面,大数放在后面,倒数第二个数便是第二大的数;同理第i轮操作前n-i+1的数据(假设i取值是从1开始的),则n-i+i位置上的数据为第i大的数据。一共有n-1轮,第i轮比较中共比较n-i次比较。 核心代码
void Bubblesort() {
int i,j,k,x=0,y=0,m=0;
int exchange=TRUE;//标志位exchange初始化为TRUE 1 printf(\原始数据为(按回车键开始排序):\\n\\t\\t\ for(k=1;k<=L;k++) {
- 5 -
}
printf(\}
getchar(); printf(\
for(i=1;i printf(\比较次数是:\\t\\t\printf(\ printf(\移动次数是:\\t\\t\printf(\ printf(\排序最终结果是:\\n\\t\\t\for(i=1;i<=L;i++) { printf(\} - 6 - 图二 直接插入排序 4.1.2 快速排序 核心思想 首先检查数据列表中的数据数,如果小于两个,则直接退出程序。如果有超过两个以上的数据,就选择一个分割点将数据分成两个部分,小于分割点的数据放在一组,其余的放在另一组,然后分别对两组数据排序。 通常分割点的数据是随机选取的。这样无论你的数据是否已被排列过,你所分割成的两个字列表的大小是差不多的。而只要两个子列表的大小差不多 核心代码 //递归算法实现 void Quicksort(int low,int high) { int i=low,j=high,k; R[0].key=R[low].key; while(i - 7 -