首页 > 代码库 > 我的读书笔记(排序算法)
我的读书笔记(排序算法)
1.快速排序
- 假设待排序的序列为L[m...n],而一趟排序目的就是将其分割为两个子序列,分别为L[m...middle-1]和L[middle+1...n],其中L[m...middle-1]中的每个元素都小于L[middle],而L[middle+1...n]中的每个元素都大于L[middle]
- 递归调用快速排序算法,对L[m...middle-1]和L[middle+1..n]分别进行排序
- 由于是原地排序,所以递归结束后就自然形成了有序序列
1 /// <summary> 2 /// 快速排序算法 3 /// </summary> 4 /// <param name="data">排序数组</param> 5 /// <param name="low">排序下限</param> 6 /// <param name="high">排序上限</param> 7 static void Run(int[] data,int low, int high) 8 { 9 //简单设定中间值,并以此为一趟排序的分割点10 //注意这里是一个简单的算法11 //如果想对这个算法进行优化的话,可以采取随机的方法来获取分割点12 int middle = data[(low+high)/2];13 int i = low;14 int j = high;15 do16 {17 //扫描middle值左边的元素18 while (data[i] < middle && i < high)19 i++;20 //扫描middle值右边的元素21 while (data[j] > middle && j > low)22 j--;23 //找到了一个可以交换的值24 if (i <= j)25 {26 //交换27 int temp = data[i];28 data[i] = data[j];29 data[j] = temp;30 i++;31 j--;32 }33 34 } while (i <= j);35 //递归对比分割点元素都小的那个序列进行快速排序36 if (j > low)37 Run(data,low,j);38 //递归对比分割点元素都大的那个序列进行快速排序39 if(i<high)40 Run(data,i,high);41 }
快速排序在最坏的情况下运行时间为0(n*n)平均运行时间为O(nlgn),快速排序的排序对象都读入内存中,所以输入内部排序,快速排序基于比较关键字来确定元素的位置,所以它属于比较排序,同时,快速排序具有原地排序特性和不稳定特性,这意味着快速排序不需要额外的排序空间,但是不能确保相等元素位置不被交换。
2.二分法查找算法
- 在一个有序序列L[m...n]查找元素k,先比较L[(m+n)/2]的值和元素K,如果相等则返回(m+n)/2
- 如果L[(m+n)/2]的值比K小,则在L[(m+n)/2+1...n]中使用二分法查找K
- 如果L[(m+n)/2]的值比K大,则在L[m...(m+n)/2-1]中使用二分法查找K
1 static int Search(int[] data ,int val) 2 { 3 //如果数组为空,则直接返回-1 4 if (data.Length <= 0) return -1; 5 //设置初始化上下限为数组的上下限 6 int low = 0; 7 int high = data.Length - 1; 8 //循环二分法查找,直至找到或者查找完毕 9 while(low<=high)10 {11 //找到制定元素12 int middle = (low + high) / 2;13 if (data[middle] == val)14 return middle;15 //对二分后较大的那一半序列进行查找16 else if (data[middle] < val)17 low = middle + 1;18 //对二分后较小的那一半序列进行查找19 else20 high = middle - 1;21 }22 //二分结束仍没找到指定元素23 return -1;24 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。