排序算法:插入排序,折中插入排序
Posted MICBB
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法:插入排序,折中插入排序相关的知识,希望对你有一定的参考价值。
1??插入排序:把序列分为有序和无序两部分排序,如果是升序,则无序和有序比较小则有序右移直到找到大于有序值然后替换,大于则不变,有序++;继续比较;
主要用途:直接插入算法实现简单,在序列基本有序的情况下,移动和比较的次数少,所以有序情况下优先插入排序
复杂度与稳定度:属于稳定的排序方法,时间复杂度 O(n^2) 空间复杂度 O(1);
C/C++:
1 #include <iostream> 2 3 int *InsertSort(int *Array, int size) 4 { 5 if (Array == nullptr) 6 return nullptr; 7 8 //思想分为有序和无序部分 9 int unorder = 0, order = 0, temp; 10 11 for (unorder = 1; unorder < size; unorder++) 12 { 13 //保存比较的值 14 temp = *(Array + unorder); 15 for (order = unorder - 1; order >= 0 && temp < *(Array + order); order--) 16 { 17 //升序,无序值小于有序值则有序值右移,直到找到比有序小的或order==0; 18 *(Array + order + 1) = *(Array + order); 19 } 20 //不移动则赋值给自身,或者找到插入位置,赋值插入位置后的位置; 21 *(Array + order + 1) = temp; 22 } 23 return Array; 24 } 25 26 27 int main() 28 { 29 30 int a[] = {17, 46, 32, 87, 58, 9, 50, 38}; 31 int size = sizeof(a) / sizeof(int); 32 InsertSort(a, size); 33 34 std::for_each(std::begin(a), std::end(a), [](int &value) 35 { std::cout << value << "\t"; }); 36 std::cout << std::endl; 37 return 0; 38 }
2??折中插入排序:与插入排序的区别,寻找插入位置由从右到左遍历比较变为二分法查找比较(减少比较次数)
主要用途:同插入排序
复杂度与稳定度:同插入排序(虽然比较次数少了)
C/C++:
#include <iostream> //折中插入排序,和插入排序的区别就是改变 无序在有序中查找位置的方式,前者是折中查找(减少比较次数),后者是从右到左遍历比较 int *HalfInsertSort(int *Array, int size) { if (Array == nullptr) return nullptr; //思想分为有序和无序部分 int unorder = 0, order = 0, temp; //计算机中两数之和除以2取整之后值靠左(个人理解),(low+hight)/2 最终位置保存在low位置; int low = 0, hight = 0, mid = 0; for (unorder = 1; unorder < size; unorder++) { //保存比较的值 temp = *(Array + unorder); //寻找位置,终止条件位置出现负值之前- -,(升序) for (low = 0, hight = unorder - 1; hight >= low;) { mid = (low + hight) / 2; if (temp < *(Array + mid)) { hight = mid - 1; } else { low = mid + 1; } } //找到插入点low,移动 for (order = unorder - 1; order >= low; order--) { //升序,无序值小于有序值则有序值右移,直到找到比有序小的或order==0; *(Array + order + 1) = *(Array + order); } *(Array + low) = temp; } return Array; } int main() { int a[] = {17, 2, 3, 5, 4, 4, 34, 43, 323, 434, 234, 21, 46, 32, 87, 58, 9, 50, 38}; int size = sizeof(a) / sizeof(int); InsertSort(a, size); std::for_each(std::begin(a), std::end(a), [](int &value) { std::cout << value << "\t"; }); std::cout << std::endl; return 0; }
以上是关于排序算法:插入排序,折中插入排序的主要内容,如果未能解决你的问题,请参考以下文章