数据结构培训 c语言 排序

没有更多推荐了,
不良信息举报
举报内容:
数据结构排序算法之归并排序(c语言实现)
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!没有更多推荐了,
不良信息举报
举报内容:
c语言数据结构 简单选择排序
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!数据结构:从插入排序到希尔排序_Linux编程_Linux公社-Linux系统门户网站
你好,游客
数据结构:从插入排序到希尔排序
来源:Linux社区&
作者:MrSaver
插入排序(C语言版)
  算法思路:
  每次从无序表中取出第一个元素,将其插入到有序表中的适当位置,使有序表的长度不断加长,完成排序过程。  n个待排序的元素由一个有序表和一个无序表组成,开始时有序表中只包含一个元素。
&   流程演示:
        蓝色表示由有序表,黑色表示无序表!
    元素基本有序时,直接插入排序的时间复杂度接近于O(n)&     元素数目n较少时,直接插入排序的效率较高
数据结构定义:
  首先我们要构建一个顺序表来存放待排序的元素!   
  这是我排序的基础,我的所有的排序算法都会依赖于这个简单的顺序表!
// 定义关键字类型为整型
typedef struct
// 关键字项
// 其他数据项
// 记录类型
typedef struct {
RedType r[MAXSIZE+1];
// r[0]闲置或用作哨兵
// 顺序表长度
  编写了两个方法可以对顺序表进行初始化和遍历
void initSqList(SqList & S)
int t,count=0;
while(scanf("%d",&t)!=0)
S.r[count].key=t;
void traverseSqList(SqList S)
for(int i=1;i&=S.i++)
printf("%d",S.r[i].key);
优化的直接插入排序
我们在这里采用了优化,我们进行的是元素的移动和覆盖,而不仅仅是简单的交换。
void sortByDirectlyInsert(SqList &L)
for(int i = 2; i &= L. i++)
//第一个元素默认有序,所以直接从2开始
if (L.r[i].key & L.r[i-1].key) {
//这里进行了优化,如果i &i-1,说明从1~i这一段都是有序的,我们不需要进行后续操作
L.r[0] = L.r[i];
L.r[i] = L.r[i-1];
for(j = i - 2;L.r[0].key & L.r[j]. j--)
L.r[j+1] = L.r[j];
L.r[j+1] = L.r[0];
思路举例:  [ ]5 9 6 3 8 //待排序元素  [ ]5 9 //到这里是有序的  [ ]5 9 6 //到这里发现6小于9    [6 ]5 9 空 //将6移到监视哨,把它的位置空出来    [6 ]5 空 9 //让9来到原来6的位置,把9的位置空出来,看看6能不能填在那里    [6 ]5 6 9 //6可以填在那里,让空的位置等于监视哨  []5 6 9 3     [3 ]5 6 9 空    [3 ]5 6 空 9    [3 ]5 空 6 9    [3 ]空 5 6 9    [3 ]3 5 6 9  []3 5 6 9 8    [8 ]3 5 6 9 空    [8 ]3 5 6 空 9    [8 ]3 5 6 8 9  []3 5 6 8 9
进一步优化版的插入排序
我们这样想,既然左半部分是是有序的,我们在有序的数组中找到插入位置,最好的方法非二分查找莫属。
void sortByBinaryDirectlyInsert(SqList &L)
for(int i=2;i &= L. i++)
L.r[0] = L.r[i];
/* 保存待插入元素 */
int low = 1,high = i-1;
/* 设置初始区间 */
while(low &= high)
/* 确定插入位置 */
int mid = (low+high)/2;
if (L.r[0].key & L.r[mid].key)
low = mid+1;
/* 插入位置在高半区中 */
high = mid-1;
/* 插入位置在低半区中 */
}/* while */
for(int j = i - 1; j &= high +1;
j--) /* high+1为插入位置 */
L.r[j+1] = L.r[j];
/* 后移元素,留出插入空位 */
L.r[high+1] = L.r[0];
/* 将元素插入 */
}/* for */
算法思想:
  先将整个待排序元素序列分割成若干个小序列,在小序列内插入排序;  逐渐扩大小序列的长度(序列个数减少),使得整个序列基本有序;  最后再对全体元素进行一次直接插入排序。
代码实现:
void ShellInsert(SqList &L,int dk)
{//对顺序表L作一趟希尔排序
for(int i =dk+1; i &= L. i++)
if (L.r[i].key & L.r[i-dk].key) {
L.r[0] = L.r[i];
for(j = i -
j&0 &&L.r[0].key & L.r[j].
L.r[j+dk] = L.r[j];
L.r[j+dk] = L.r[0];
} //ShellInsert
void ShellSort(SqList &L,int dlta[],int t)
//按增量序列dlta[0..t-1]进行希尔排序
for(int k = 0; k & k++)
ShellInsert(L,dlta[k]);
//一趟增量为dlta[k]的希尔排序
} //ShellSort
  1.希尔排序的实质是插入排序!希尔排序的分析是一个复杂的问题,增量序列的设置是关键,尚没有正式的依据说明何种设置最为合理!
  2.空间复杂度为O(1),是一种不稳定的排序算法!
本文永久更新链接地址:
相关资讯 & & &
& (11/25/:34)
& (05/27/:02)
& (04/14/:30)
& (09/19/:54)
& (05/27/:33)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款当前位置:&&
数据结构课程设计(内部排序算法比较_c语言)【最新精选】,c语言排序算..
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
数据结构课程设计(内部排序算法比较_c语言)【最新精选】
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://jz.docin.com/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口没有更多推荐了,
不良信息举报
举报内容:
数据结构 C语言实现快速排序
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 数据结构与算法 c语言 的文章

 

随机推荐