C语言简单查找排序方法及代码

上传人:宝路 文档编号:2983478 上传时间:2017-07-29 格式:DOC 页数:31 大小:153.51KB
返回 下载 相关 举报
C语言简单查找排序方法及代码_第1页
第1页 / 共31页
C语言简单查找排序方法及代码_第2页
第2页 / 共31页
C语言简单查找排序方法及代码_第3页
第3页 / 共31页
C语言简单查找排序方法及代码_第4页
第4页 / 共31页
C语言简单查找排序方法及代码_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《C语言简单查找排序方法及代码》由会员分享,可在线阅读,更多相关《C语言简单查找排序方法及代码(31页珍藏版)》请在金锄头文库上搜索。

1、第一部分 查找1、线性查找法:import java.util.Scanner;public class SearchDataElement public static void main(String args) Scanner scanner=new Scanner(System.in);intarray;array=new int8,7,5,4,1,5,9,6,3,4;for(int i=0;i=low)int mid=(low+high)/2;if(key2 #include 4 /插入排序从下到大,nData 为要排序的数据,nNum 为数据的个数,该排序是稳定的排序 5 bool

2、InsertionSort(int nData, int nNum)6 7 for (int i = 1; i nTemp) /找到位置,然后插入该位置,之后的数据后移13 14 for (int k = i; k j; -k) /数据后移15 16 nDatak = nDatak -1;17 18 nDataj = nTemp; /将数据插入到指定位置19 break;20 21 22 24 return true;25 27 int main()28 29 int nData10 = 4,10,9,8,7,6,5,4,3,2; /创建 10 个数据,测试30 InsertionSort(n

3、Data, 10); /调用插入排序32 for (int i = 0; i 就像冒泡一样,轻的在上面,重的在下面,换成数据,就是小的在上面,大的在下面。 我们先把最轻的冒出到顶端,然后冒出第二轻的在最轻的下面,接着冒出第三轻的。依次内推。直到所有都冒出来了为止。3.我们怎么做到把最轻的放在顶端呢?我们从最底下的数据开始冒,如果比他上面的数据小,就交换(冒上去) ,然后再用第二第下的数据比较(此时他已经是较轻的一个) ,如果他比他上面的小,则交换,把小的冒上去。直到比到第一位置,得到的就是最轻的数据咯,这个过程就像是冒泡一样,下面的和上面的比较,小的冒上去。大的沉下来。 画个图先:最初 第一次

4、结果 第二次结果 第三次结果3 3 3 14 4 1 32 1 4 41 2 2 2开始:1 和 2 比,1 比 2 小,浮上,然后 1 跟 4 比,再 1 跟 3 比,这样结构就变为1,3,4,2。最小的位置确定了,然后我们确定第二小的,同理 2 vs 4, 2 vs 3 得到 2, 再确定第 3 小数据,3 vs 4 得到 3,最后就是 4 为最大的数据,我们冒泡就排好了。注:这里红色的 1,2 是前一次比较 1 vs 2 交换的结构。后面也一样。大概思路就这样了,奉上源代码:#include #include /冒泡排序, pnData 要排序的数据, nLen 数据的个数int Bub

5、bleSort(int* pnData, int nLen)bool isOk = false; /设置排序是否结束的哨兵/i 从0,nLen-1) 开始冒泡,确定第 i 个元素for (int i = 0; i i; -j)if (pnDataj #include /选择排序, pnData 要排序的数据, nLen 数据的个数int SelectSort(int* pnData, int nLen)/i 从0,nLen-1) 开始选择,确定第 i 个元素for (int i = 0; i #include /对单个组排序int SortGroup(int* pnData, int nLen

6、, int nBegin,int nStep)for (int i = nBegin + nStep; i j; k -= nStep)pnDatak = pnDatak - nStep;pnDataj = nTemp;return 1;/希尔排序, pnData 要排序的数据, nLen 数据的个数int ShellSort(int* pnData, int nLen)/以 nStep 分组,nStep 每次减为原来的一半。for (int nStep = nLen / 2; nStep 0; nStep /= 2)/对每个组进行排序for (int i = 0 ;i 2,所以把而放进去(4

7、) 57 468 123000 同理 3 4(6) 7 68 1234500 同理 5 6(7) 7 8 1234560 同理 7 6(8) 0(空了 ) 8 12345670 同理 7 2 #include 4 /合并排序的合并程序他合并数组 nData 中位置为nP,nM) 和nM,nR).这个是更接近标准的思路5 bool MergeStandard(int nData, int nP, int nM, int nR) 6 7 int n1 = nM - nP; /第一个合并数据的长度8 int n2 = nR - nM; /第二个合并数据的长度10 int *pnD1 = new in

8、tn1 + 1; /申请一个保存第一个数据的空间11 int *pnD2 = new intn2 + 1; /申请二个保存第一个数据的空间13 for (int i = 0; i = nEnd - 1) /已经到最小颗粒了,直接返回108 109 return false;110 112 int nMid = (nBegin + nEnd) / 2; /计算出他们的中间位置,便于分治113 MergeRecursion(nData, nBegin, nMid); /递归调用,合并排序好左边一半114 MergeRecursion(nData, nMid, nEnd); /递归调用,合并排序好右

9、边一半115 /Merge(nData, nBegin, nMid, nEnd); /将已经合并排序好的左右数据合并,时整个数据排序完成116 MergeStandard(nData, nBegin, nMid, nEnd);/(用更接近标准的方法合并)118 return true;119 121 /合并排序122 bool MergeSort(int nData, int nNum)123 124 return MergeRecursion(nData, 0, nNum); /调用递归,完成合并排序125 127 int main()128 129 int nData10 = 4,10,3

10、,8,5,6,7,4,9,2; /创建 10 个数据,测试131 MergeSort(nData, 10);132 for (int i = 0; i #include /交换两个整数。注意一定要 if 判断是否两个相等,如果/不相等才交换,如果相等也交换会出错的。aa = 0inline void Swap(int& a, int& b)if (a != b)a= b;b= a;a= b; /维持一个最大堆int Heapify(int* npData, int nPos, int nLen)int nMax = -1; /暂存最大值int nChild = nPos * 2; /他的左孩子

11、位置while(nChild = 1; -i)Heapify(npData, i, nLen);return 1;/堆排序int HeapSort(int* npData, int nLen)BuildHeap(npData, nLen); /建立一个堆。while(nLen = 1) /逐一交和第一个元素交换数据到最后 /完成排序Swap(npDatanLen, npData1);-nLen;Heapify(npData, 1, nLen);/交换之后一定要维持一下堆得性质。 /不然小的成第一个元素,就不是堆了。return 1;/main 函数,int main()int nData11

12、= 0,9,8,7,6,5,4,3,2,1,0; /测试数据,下标从 1 开始哦。HeapSort(nData, 10); /堆排序for (int i = 1; i #include /定义一个堆得结构体,struct MyHeap int* pnData; /指向数据的指针int nSize; /当前堆中的元素个数;/调整数据,维持堆得性质,这个和上次 heapify 的作用一样/只是这个时从子道父节点这样的判断而已。int IncreaseKey(MyHeap* pHeap, int nPos)/循环和他父节点判断,只要 nPos 1 他就有父节点 while(nPos 1) int n

13、Max = pHeap-pnDatanPos;int nParent = nPos / 2;/如果他比父节点大,交换数据,并使判断进入父节点/(因为只有父节点可能会影响堆得性质。他的数据改变了。 )if (nMax pHeap-pnDatanParent)pHeap-pnDatanPos = pHeap-pnDatanParent;pHeap-pnDatanParent = nMax;nPos = nParent;else /否则堆没有被破坏,退出循环break;return 1;/插入数据,这里 pnHeap 为要插入的队,nLen 为当前堆得大小。/nData 为要插入的数据,这里注意报保证堆得空间足够。int Insert(MyHeap* pHeap, int nData)+pHeap-nSize; /添加数据到末尾pHeap-pnDatapHeap-nSize = nData;IncreaseKey(pHeap, pHeap-nSize);return 1;/弹出堆中对大元素,并使堆得个数减一int PopMaxHeap(MyHeap* pHeap)int nMax = pHeap-pnData1; /得到最大元素/不要忘记维持堆得性质,因为最大元素已经弹出了,主要思路就是 /同他最大孩子填充这里。int nPos = 1; /起始位 1,因为他弹出,所以是这

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 试题/考题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号