考研编程-查找排序
排序算法不要求会写,但动手编程会理解更深刻
Jiawen9
从来不自诩有不带偏见看待事物的所谓眼界和宽容,但会一直坚守接触之后能重新认识人和事物的勇气。
展开
-
【数据结构·考研】链表插排
题目: 对带头结点的单链表 Head 进行插入排序,排序后结点值从小到大排序。思路:链表不同于顺序表,不能实现从待排序结点从后向前的遍历,所以将链表分为两部分,一部分有序一部分无序,将无序的部分依次插入到有序的部分中来。void LinkInsertSort(LinkList& head){ if (head->next == NULL) return; //空表返回 //准备操作 ListNode* cur; //cur指向当前待插入的结点 ListNod.原创 2020-11-09 21:23:30 · 222 阅读 · 0 评论 -
【数据结构·考研】简单选择排序
简单选择排序简单选择排序是最简单的选择类排序,是一种不稳定排序。每次在待排序区间寻找最小的一个元素,将它与待排序区间的第一个元素交换,紧接着待排序区间长度- 1,再寻找当前待排序区间寻找最小的一个元素,当待排序区间剩余一个元素的时候,选择排序结束。void SelectSort(int* arr,int len){ for(int i = 0;i < len-1;i ++){ int k = i; for(int j = i + 1;j < len;j ++) if原创 2020-09-16 09:40:05 · 203 阅读 · 0 评论 -
【数据结构·考研】冒泡排序
冒泡排序冒泡排序是交换排序的一种,冒泡排序是稳定排序。冒泡排序就像接力一样,从1号位出发,如果遇到比它大的,就由新的这个元素接过接力棒,继续寻找比自己大的元素,直到找到数组末尾,最大的元素就被定到了最后一位。紧接着再来找第二大的元素定到倒数第二位、第三大元素、第四、、、。有序的区间不断增大,当中途没有出现交换的时候或者是非有序元素只剩一个,排序就结束。void BubbleSort(int* arr,int len){ int i = 0; int exchange = 1; while原创 2020-09-16 09:33:08 · 236 阅读 · 0 评论 -
【数据结构·考研】堆排序
堆排序前一篇博客中我们列举了对小根堆的相关操作。想把一个数组按照从小到大的顺序来排列,需要用到大根堆。同理,从大到小排序需要小根堆。我们现在试着把一个数组从小到大排序,那么就需要用到大根堆。每次把根与堆的第 len 个元素交换,然后对大小为 len - 1 的堆进行重建堆。不断重复上述过程,直到堆中只剩一个元素。堆排序需要用到向下筛选算法,和重建堆的算法,时间复杂度为 O( N logN )。//大根堆的向下筛选算法 void SiftDown(int* arr,int star原创 2020-09-15 12:26:21 · 384 阅读 · 0 评论 -
【数据结构·考研】堆的插入和删除
堆的建立 - 小根堆堆的建立有两种方法:一是直接在原有数组上从最后一个非叶子结点开始不段执行向下筛选算法。二是给定一个空堆,把数组中的元素一个一个插入到堆里,每插入一个元素都进行向上筛选。法一的时间复杂度 O ( N ),法二的时间复杂度 O ( N logN )。小根堆的向下筛选算法//小根堆的向下筛选算法 void SiftDown(int* arr,int start,int m){ int i = start; int j = 2*i + 1; //左孩子 int tem原创 2020-09-15 12:17:38 · 666 阅读 · 0 评论 -
【数据结构·考研】快速排序
快速排序快速排序有三种写法,平均复杂度几乎相同。我们这里给出最常见的那种,把第一个元素拎出来,然后找到它该去的地方再塞进去。快速排序和冒泡排序都属于交换排序,都属于不稳定排序。一趟快速排序定一个位置,并且把区间分为两部分。int Partition(int* arr,int i,int j){ //j逆向遍历,i正向遍历 int temp = arr[i]; //temp存储基准值 while(i < j){ //逆向遍历 while(i < j &原创 2020-09-14 17:42:06 · 656 阅读 · 0 评论 -
【数据结构·考研】希尔插入排序
希尔插入排序//希尔排序void ShellSort(int* arr,int len){ int gap = len/2; //gap初始化为数组长度的一半 while(gap != 0){ //循环直到gap为0 //对每一个元素都进行直接插入排序,比较的间隔由gap决定 for(int i = gap;i < len;i++){ int temp = arr[i]; int j; for(j = i;j-gap >= 0;j =原创 2020-09-14 10:47:55 · 220 阅读 · 0 评论 -
【数据结构·考研】直接插入排序和二分插入排序
直接插入排序//直接插入排序 void InsertSort(int* arr,int len){ for(int i = 1;i < len;i ++){ //比较len-1趟 if(arr[i] < arr[i-1]){ //找到一个不符合队伍特征的元素 //把它的值交给temp int temp = arr[i]; arr[i] = arr[i-1]; //从后向前比较 int j; for(j = i - 1;j >原创 2020-09-14 09:40:31 · 358 阅读 · 0 评论 -
【数据结构·考研】二分查找
二分查找适用于有序的顺序表,时间复杂度为对数级别。非递归实现://非递归 int BinarySearch(int* arr,int len,int key){ //数组、数组长度、关键字 int left = 0; int right = len - 1; while(left <= right){ int mid = (left + right)/2; if(arr[mid] == key) return mid; else if(arr[mid] > key原创 2020-09-13 11:22:50 · 249 阅读 · 0 评论