这个程序是我刚刚学OI的时候写的程序。因为那时候刚刚开学,又面临着开学考试,用了好几个晚上赶了出来,写的有些粗糙,请见谅。
那时候总是写程序写到晚上12点,这个程序也获得了2014年日照市中小学电脑制作活动二等奖……虽然不理想,但也是个奖……
既然活动结束了,我将公开源代码,请在FreePascal2.0.4下编译,然后再Windows下执行(不要直接Run,否则中文将显示乱码)
程序很简单,就是简单的输入输出操作,以及把各个简单排序算法整合在一起。
下面是源代码(转载或上传到网络时请注明作者版权,谢谢合作):
点击这里下载:
program sort; uses crt; label 1,2; type arr=array[0..100] of integer; var choose1,choose2,n,i,counter,cou:integer; a:array[0..100]of integer; procedure selectionsort(a:array of integer); var i,j,k,t,r,counter:integer; begin counter:=0; for i:=1 to n-1 do begin k:=i; for j:=i+1 to n do if a[j]<a[k] then k:=j; if k<>i then begin inc(counter); t:=a[i]; a[i]:=a[k]; a[k]:=t; write(‘第‘,counter,‘次交换‘); for r:=1 to n do write(a[r],‘ ‘); readln; end; end; writeln(‘排序完毕!‘); readln; end; procedure bubblesort(a:array of integer); var i,j,k,t,r,counter:integer; begin counter:=0; for i:=1 to n-1 do for j:=n downto i+1 do if a[j-1]>a[j] then begin inc(counter); t:=a[j-1]; a[j-1]:=a[j]; a[j]:=t; write(‘第‘,counter,‘次交换:‘); for r:=1 to n do write(a[r],‘ ‘); readln; end; writeln(‘排序完毕!‘); readln; end; procedure insertionsort(a:array of integer); var i,j,k,t,r,counter:integer; begin counter:=0; for i:=2 to n do begin k:=a[i]; j:=i-1; while (k<a[j]) and (j>0) do begin a[j+1]:=a[j]; j:=j-1 end; a[j+1]:=k; inc(counter); write(‘第‘,counter,‘轮:‘); for r:=1 to n do write(a[r],‘ ‘); readln; end; writeln(‘排序完毕!‘); readln; end; procedure qsort(var d:arr;head,tail:longint); var x,i,j,r:longint; begin x:=d[head]; i:=head; j:=tail; while i<j do begin while(i<j)and(d[j]>=x)do j:=j-1; d[i]:=d[j]; while(i<j)and(d[i]<=x)do i:=i+1; d[j]:=d[i]; end; d[i]:=x; inc(cou); write(‘第‘,cou,‘轮:‘); for r:=1 to n do write(a[r],‘ ‘); writeln; writeln(‘a[‘,i,‘]=‘,x,‘将区间[‘,head,‘,‘,tail,‘]分割成两个部分‘,‘,该数前面的数比它小,后面的数比它大.‘); readln; if head<j-1 then qsort(d,head,j-1); if i+1<tail then qsort(d,i+1,tail); end; begin randomize; 1: textcolor(white); writeln(‘ 简单排序算法学习软件‘); textcolor(Green); writeln(‘请选择排序算法学习:‘); writeln(‘=========================‘); writeln(‘1.选择排序(SelectionSort)‘); writeln(‘2.冒泡排序(BubbleSort)‘); writeln(‘3.插入排序(InsertionSort)‘); writeln(‘4.快速排序(QuickSort)‘); writeln(‘=========================‘); writeln(‘5.关于作者‘); writeln(‘0.退出‘); writeln(‘==========‘); write(‘请选择:‘); repeat readln(choose1); writeln; if choose1=0 then halt; if choose1=5 then begin clrscr; writeln(‘作者:崔晨‘); writeln; writeln(‘莒县第一中学2013级7班‘); writeln; writeln(‘本程序为参赛作品,由崔晨独立编写;‘); writeln; writeln(‘其中参考了一些书籍或网络上关于排序算法的代码和相关描述;‘); writeln; writeln(‘程序主体部分为作者原创,排序算法的演示更是创新;‘); writeln; writeln(‘本程序采用FreePascal2.0.4编写,程序代码部分共410行;‘); writeln; writeln(‘如有建议欢迎批评指正.‘); readln; clrscr; goto 1; end; if (choose1<>1)and(choose1<>2)and(choose1<>3)and(choose1<>4)and(choose1<>5) then write(‘输入有误,请重新输入:‘); until (choose1=1)or(choose1=2)or(choose1=3)or(choose1=4)or(choose1=5); clrscr; 2: textcolor(white); case choose1 of 1:write(‘ 选择排序‘); 2:write(‘ 冒泡排序‘); 3:write(‘ 插入排序‘); 4:write(‘ 快速排序‘); end; writeln(‘学习‘); textcolor(green); writeln(‘1.程序模拟演示‘); writeln(‘2.算法描述‘); writeln(‘3.查看示例代码‘); writeln(‘0.返回主菜单‘); writeln(‘请选择:‘); repeat readln(choose2); if (choose2<>1)and(choose2<>2)and(choose2<>3)and(choose2<>0) then write(‘输入有误,请重新输入:‘); until (choose2=1)or(choose2=2)or(choose2=3)or(choose2=0); if choose1=1 then begin clrscr; if choose2=2 then begin writeln(‘(1)设数组a存放数据;‘); writeln; writeln(‘(2)在1~n中选择值最小的元素,与第1位置元素交换;‘); writeln; writeln(‘(3)在2~n中选择值最小的元素,与第2位置元素交换......‘); writeln; writeln(‘(4)直到第n-1元素与第n个元素比较排序为止‘); writeln; writeln; writeln(‘程序实现方法:用两重循环完成算法,外重循环i控制当前序列最小值存放的数组位置,‘); writeln(‘ 内循环j控制i+1到n序列中选择最小的元素所在位置k.‘); writeln; writeln(‘算法时间复杂度为O(n^2)‘); readln; clrscr; goto 2; end; if choose2=3 then begin writeln(‘var a:array[0..1000] of longint;‘); writeln(‘ i,j,k,t:integer;‘); writeln(‘begin‘); writeln(‘ readln(n);‘); writeln(‘ for i:= 1 to n do read(a[i]);‘); writeln(‘ for i:=1 to n-1 do‘); writeln(‘ begin‘); writeln(‘ k:=i;‘); writeln(‘ for j:=i+1 to n do‘); writeln(‘ if a[j]<a[k] then k:=j;‘); writeln(‘ if k<>i then‘); writeln(‘ begin t:=a[i];a[i]:=a[k];a[k]:=t;end;‘); writeln(‘ end;‘); writeln(‘ for i:= 1 to n do write(a[i]:6);‘); writeln(‘ end.‘); readln; clrscr; goto 2; end; if choose2=1 then begin writeln(‘请输入演示数据的个数(系统将随机产生数据),建议不超过15:‘); readln(n); for i:=1 to n do a[i]:=random(1000); write(‘未排序前:‘); for i:=1 to n do write(a[i],‘ ‘); writeln; selectionsort(a); clrscr; goto 2; end; end; if choose1=2 then begin clrscr; if choose2=2 then begin writeln(‘(1)设数组a存放数据;‘); writeln; writeln(‘(2)对尚未排序的各元素从头到尾依次比较相邻的两个元素是否逆序(与预排顺序相反),‘); writeln(‘ 若逆序就交换这两个元素;‘); writeln; writeln(‘(3)经过第一轮比较后便可把最大(或最小)的元素排好;‘); writeln; writeln(‘(4)用同样的办法把剩下的元素逐个比较,如果有n个元素,‘); writeln(‘ 那么一定要进行n-1轮比较,就得到了所需要的排序.‘); writeln; writeln(‘程序实现方法:用两重循环完成算法,外重循环i控制每轮要进行多少次的比较,‘); writeln(‘ 第一轮比较n-1次,第二轮n-2次......最后一轮比较一次.‘); writeln(‘ 内重循环j控制每轮i次比较相邻两个元素是否逆序,若逆序就交换这两个元素‘); writeln; writeln(‘算法时间复杂度为O(n^2)‘); readln; clrscr; goto 2; end; if choose2=3 then begin writeln(‘var a:array[0..1000] of integer;‘); writeln(‘ i,j,k,t:integer;‘); writeln(‘begin‘); writeln(‘readln(n);‘); writeln(‘ for i:= 1 to n do read(a[i]);‘); writeln(‘ for i:=1 to n-1 do‘); writeln(‘ for j:=1 to n-i do‘); writeln(‘ if a[j]>a[j+1] then‘); writeln(‘ begin t:=a[j+1];a[j+1]:=a[j];a[j]:=t; end;‘); writeln(‘ for i:= 1 to n do write(a[i]:6);‘); writeln(‘ end.‘); readln; clrscr; goto 2; end; if choose2=1 then begin writeln(‘请输入演示数据的个数(系统将随机产生数据),建议不超过15:‘); readln(n); for i:=1 to n do a[i]:=random(1000); write(‘未排序前:‘); for i:=1 to n do write(a[i],‘ ‘); writeln; bubblesort(a); clrscr; goto 2; end; end; if choose1=3 then begin clrscr; if choose2=2 then begin writeln(‘(1)设数组a存放数据;‘); writeln; writeln(‘(2)从第2个数开始,取出当前数作为待排序数,逐个与前面的数比较,‘); writeln(‘ 若小于前面的数,则前面数后移,当大于等于前面数时,插入当前空出的位置.‘); writeln; writeln(‘(3)直到第n个数插入到正确位置为止.‘); writeln; writeln; writeln(‘程序实现方法:用两重循环完成算法,外重循环i控制待排数字序数,‘); writeln(‘ 从第2个数到第n个数,内重循环j控制插入的位置,‘); writeln(‘ j值从i-1开始向前扫描,边扫描边将数据后移,寻找到位置,插入当前值.‘); writeln; writeln(‘算法时间复杂度为O(n^2)‘); readln; clrscr; goto 2; end; if choose2=3 then begin writeln(‘var a:array[0..1000] of longint;‘); writeln(‘ n,i,j:longint;‘); writeln(‘begin‘); writeln(‘ readln(n);‘); writeln(‘ for i:= 1 to n do read(a[i]);‘); writeln(‘ for i:=2 to n do‘); writeln(‘ begin‘); writeln(‘ a[0]:=a[i];j:=i-1;‘); writeln(‘ while (a[0]<a[j]) and (j>0) do‘); writeln(‘ begin a[j+1]:=a[j];j:=j-1 end;‘); writeln(‘ a[j+1]:=a[0];‘); writeln(‘ end;‘); writeln(‘ for i:= 1 to n do write(a[i]:6);‘); writeln(‘ end.‘); readln; clrscr; goto 2; end; if choose2=1 then begin writeln(‘请输入演示数据的个数(系统将随机产生数据),建议不超过15:‘); readln(n); for i:=1 to n do a[i]:=random(1000); write(‘未排序前:‘); for i:=1 to n do write(a[i],‘ ‘); writeln; insertionsort(a); clrscr; goto 2; end; end; if choose1=4 then begin clrscr; if choose2=2 then begin writeln(‘(1)首先从待排序区间(初始时为[1..n])中选取一个元素作为基准元素;‘); writeln(‘ (方便起见,一般是选取区间内的第一个元素)‘); writeln; writeln(‘(2)然后从两端向中间依次进行比较和交换,‘); writeln(‘ 把位于基准元素之前且比基准元素大的交换到后面;‘); writeln(‘ 把位于基准元素之后且比基准元素小的交换到前面‘); writeln; writeln(‘(3)直至基准元素位于前后两部分的交界处‘); writeln(‘ 这样前面部分的所有元素都小于等于基准元素‘); writeln(‘ 后面部分的所有元素均大于等于基准元素‘); writeln(‘ 基准元素的所在位置就是排序后的最终位置‘); writeln; writeln(‘(4)然后再对基准元素的前后两个区间分别进行快速排序‘); writeln(‘ 直至每个区间为空或只包含一个元素,整个快速排序结束‘); writeln; writeln(‘最理想时间复杂度:O(nlogn);‘); writeln(‘最差时间复杂度:O(n^2)‘); readln; clrscr; goto 2; end; if choose2=3 then begin writeln(‘var n,i:longint;‘); writeln(‘ d:array[1..10000]of longint;‘); writeln(‘procedure qsort(head,tail:longint);‘); writeln(‘var x,i,j:longint;‘); writeln(‘begin‘); writeln(‘ x:=d[head]; i:=head; j:=tail;‘); writeln(‘ while i<j do‘); writeln(‘ begin‘); writeln(‘ while(i<j)and(d[j]>=x)do j:=j-1;‘); writeln(‘ d[i]:=d[j];‘); writeln(‘ while(i<j)and(d[i]<=x)do i:=i+1;‘); writeln(‘ d[j]:=d[i];‘); writeln(‘ end;‘); writeln(‘ d[i]:=x;‘); writeln(‘ if head<j-1 then qsort(head,j-1);‘); writeln(‘ if i+1<tail then qsort(i+1,tail);‘); writeln(‘end;‘); writeln(‘begin‘); writeln(‘ readln(n);‘); writeln(‘ for i:=1 to n do read(d[i]);‘); writeln(‘ qsort(1,n);‘); writeln(‘ for i:=1 to n do writeln(d[i]);‘); writeln(‘end.‘); readln; clrscr; goto 2; end; if choose2=1 then begin cou:=0; write(‘请输入演示数据的个数(系统将随机产生数据),建议不超过15:‘); writeln; readln(n); for i:=1 to n do a[i]:=random(1000); write(‘未排序前:‘); for i:=1 to n do write(a[i],‘ ‘); writeln; qsort(a,1,n); writeln(‘排序完毕!‘); readln; clrscr; goto 2; end; end; if choose2=0 then goto 1; end.
仅供学习和研究,请大神勿喷。
排序算法学习程序
时间: 2024-10-08 14:51:48