(1)“冒泡法” \x0d\x0a\x0d\x0a冒泡法大家都较熟悉。其原理为从a[0]开始,依次将其和后面的
元素比较,若a[0]>a[i],则交换它们,一直比较到a[n]。同理对a[1],a[2],...a[n-1]处理,即完成排序。下面列出其
代码:\x0d\x0a\x0d\x0avoid bubble(int *a,int n) /*定义两个参数:
数组首地址与数组大小*/ \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0aint i,j,temp\x0d\x0a\x0d\x0afor(i=0ia[j]) { \x0d\x0a\x0d\x0atemp=a[i]\x0d\x0a\x0d\x0aa[i]=a[j]\x0d\x0a\x0d\x0aa[j]=temp\x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0a冒泡法原理简单,但其缺点是交换次数多,效率低。 \x0d\x0a\x0d\x0a下面介绍一种源自冒泡法但更有效率的方法“选择法”。 \x0d\x0a\x0d\x0a(2)“选择法” \x0d\x0a\x0d\x0a选择法循环过程与冒泡法一致,它还定义了记号k=i,然后依次把a[k]同后面元素比较,若a[k]>a[j],则使k=j.最后看看k=i是否还成立,不成立则交换a[k],a[i],这样就比冒泡法省下许多无用的交换,提高了效率。\x0d\x0a\x0d\x0avoid choise(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0aint i,j,k,temp\x0d\x0a\x0d\x0afor(i=0ia[j]) k=j/*是k总是指向最小元素*/ \x0d\x0a\x0d\x0aif(i!=k) { /*当k!=i是才交换,否则a[i]即为最小*/ \x0d\x0a\x0d\x0atemp=a[i]\x0d\x0a\x0d\x0aa[i]=a[k]\x0d\x0a\x0d\x0aa[k]=temp\x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0a选择法比冒泡法效率更高,但说到高效率,非“快速法”莫属,现在就让我们来了解它。 \x0d\x0a\x0d\x0a(3)“快速法” \x0d\x0a\x0d\x0a快速法定义了三个参数,(数组首地址*a,要排序数组起始元素下标i,要排序数组结束元素下标j). 它首先选一个数组元素(一般为a[(i+j)/2],即中间元素)作为参照,把比它小的元素放到它的左边,比它大的放在右边。然后运用递归,在将它左,右两个子数组排序,最后完成整个数组的排序。下面分析其代码:\x0d\x0a\x0d\x0avoid quick(int *a,int i,int j) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0aint m,n,temp\x0d\x0a\x0d\x0aint k\x0d\x0a\x0d\x0am=i\x0d\x0a\x0d\x0an=j\x0d\x0a\x0d\x0ak=a[(i+j)/2]/*选取的参照*/ \x0d\x0a\x0d\x0ado { \x0d\x0a\x0d\x0awhile(a[m]k&&n>i) n--/* 从右到左找比k小的元素*/ \x0d\x0a\x0d\x0aif(mi) quick(a,i,n)\x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0a(4)“插入法” \x0d\x0a\x0d\x0a插入法是一种比较直观的排序方法。它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置。把数组元素插完也就完成了排序。\x0d\x0a\x0d\x0avoid insert(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0aint i,j,temp\x0d\x0a\x0d\x0afor(i=1i=0&&temp=1)的那几个元素排好序,再缩小k值(一般取其一半),再排序,直到k=1时完成排序。下面让我们来分析其代码:\x0d\x0a\x0d\x0avoid shell(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0aint i,j,k,x\x0d\x0a\x0d\x0ak=n/2/*间距值*/ \x0d\x0a\x0d\x0awhile(k>=1) { \x0d\x0a\x0d\x0afor(i=ki=0&&x \x0d\x0a\x0d\x0a/*别偷懒,下面的"..."代表函数体,自己加上去哦!*/ \x0d\x0a\x0d\x0avoid bubble(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0a... \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0avoid choise(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0a... \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0avoid quick(int *a,int i,int j) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0a... \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0avoid insert(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0a... \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0avoid shell(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0a... \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0a/*为了打印方便,我们写一个print吧。*/[code]\x0d\x0a\x0d\x0avoid print(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0aint i\x0d\x0a\x0d\x0afor(i=0i
回答于 2022-12-14insertion sort, heap sort and quick sort.. 我都写过,不过是C++版本哦,演示程序...模拟器吧? 自己写吧...又不难...是在不行自己去网上看看数据结构。 学程序抄代码永远学不会,理解了才记得住~
这样说吧。 insertion sort 也就是最笨的排序方法? 为什么呢?要插入就要把位置空出来,比如你插到第2个位置,你的array size 是10000, 就学要把后面9998个数据都往后挪一位,费时间,费内存
heap sort..把array 构建成 heap 的结构,这里你需要理解什么是 heap? 什么是 binary tree 2进制树, binary search tree.
quick sort. 大家用得最多的方法,但是worst case 可以达到O(n2)..
quick sort, 每次选择一个privot 然后由头到尾,同时由尾到头同时和选取的中间数比较,小的放前,大的放后。然后重复这个过程,也就是partation,直到每一部分都只有一个数,就排序好了。
经验告诉我们heapsort worst case O(nlongn) 比quick sort快,但是你也可以尝试random pivot version for quick.
之后你要想? 这些排序方法能排序link list么? 对于链表什么算法最快?
Array 是random index access
link list 只能靠指针一个一个挪
Array 搜索快..直接靠index 访问数据 O(1) 时间
Link list 插入和删除数据快 O(1) 时间
总之,不不想直接回答你的问题,或者帮你写个程序,因为这对你一点用都没有。你混过今天,混不过明天。 如果真的喜欢计算机,程序。 好好读读数据结构,算法设计, 正册表达式,等等..吃透...祝你好运。
评论列表(0条)