数据结构和算法之排序算法

插入排序的基本思想

每次将一个待排序的数据元素,按照其关键字大小插入到前面已经排好序的有序的适当位置,使插入以后的数据序列仍然为一个有序数列,直到整个序列称为有序序列为止。

直接插入排序(把待排序元素分成两部分,一部分是没排好序的元素,另一部分是排好序的元素。把没排好序的元素逐一插入以排好序的部分)

折半插入排序(向有序序列中插入元素,插入位置可以不断地平分有序序列,并把待插入的元素的关键字与平分有序序列得到的关键字比较,以确定下一步要评分的序列,直到找到合适的插入位置为之。)

希尔排序(先将整个待排序序列分割成若干子序列,每个子序列由相差一定长度的数据元素组成【这个相差的长度称为增量】)

 1 /**直接插入排序算法
 2      * @param obj
 3      * @return
 4      */
 5     public static int[] SelectSort(int[] obj) {
 6         //外层循环决定要遍历数组几轮
 7         for (int i = 1; i < obj.length; i++) {
 8             int value = obj[i];
 9             int temp = i;
10             //内层循环决定一轮中的要对比的次数
11             while (temp > 0 && value < obj[temp - 1]) {
12                 obj[temp] = obj[temp - 1];
13                 obj[temp-1]=value;
14                 temp--;
15             }
16
17         }
18         return obj;
19     }

直接插入排序算法

 1     /**折半插入排序
 2      *
 3      * @param obj
 4      * @return
 5      */
 6     public static int[] halfSort(int[] obj){
 7         int len=obj.length;//获取数组的长度
 8         int value=obj[len-1];//待插入元素
 9         int min=0;
10         int max=len-2;
11         while (min<=max) {
12             int middle=(min+max)/2;//获取数组中间元素的下标
13             if (obj[middle]>value)
14                 max=middle-1;
15             else
16                 min=middle+1;
17         }
18         for (int i = len-1; i >max+1; i--) {//元素向右移动
19             obj[i]=obj[i-1];
20         }
21         obj[max=1]=value;
22         return obj;
23     }
24     

折半插入排序

 1     /**希尔排序
 2      * @param obj
 3      */
 4     public static void shellSort(int[] obj){
 5         int temp ;//零时变量
 6         int len=obj.length/2;//分割集合的间隔长度,初始值为数组长度的一半
 7         int pointer; //进行比较的下标位置
 8         //1按每次减半划分步长,直到步长为0(设置步长增量)
 9         while (len!=0) {
10             //2对各个集合进行比较(根据步长,设置每轮循环次数)
11             for (int i = len; i <obj.length; i++) {
12                 pointer=i-len; //计算要和当前值进行比较的位置
13                 temp=obj[i];
14                 //3.将临时变量与集合内的数进行比较
15                 //按照步长距离,将临时变量里的值和集合内数值一次进行比较
16                 while (temp<obj[pointer]) {
17                     obj[pointer+len]=obj[pointer];
18                     pointer=pointer-len;//计算下一个欲进行比较的位置
19                     //如果当前下表为值大于或等于当前步长则继续循环,
20                     //按步长与墙面个所有数进行比较
21                     //直到遇到比当前临时变量小得数为止
22                     if (pointer<0) {
23                         break;
24                     }
25                 }
26                 //把临时变量赋值到当前下标所在位置
27                 obj[pointer+len]=temp;
28             }
29             len=len/2; //计算下次分割的间隔的步长
30         }

希尔排序

交换排序

冒泡排序(比较相邻的两个数据元素的关键字,如果他们之间的大小关系与期望的关系相反,则交换两个元素的位置,否则不交换。)

快速排序

时间: 2024-12-12 21:43:39

数据结构和算法之排序算法的相关文章

在Object-C中学习数据结构与算法之排序算法

笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速排序 双路快速排序 三路快速排序 堆排序 总结与收获 参考与阅读 选择排序 选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n2) 的时间复杂度.所以用到它的时候,数据规模越小越好.唯一的好处可能就是不占用额外的内存空间了吧. 1.算法步骤 首先在未排序序列中找到最小(大)元素,存放到排

算法学习-排序算法

数据结构-算法复杂度 时间复杂度 事件频度 一个算法花费的时间与算法种语句的执行次数成正比,哪个算法种语句执行次数多,它花费时间就多. 一个算法中的语句执行次数称为语句频度或时间频度.记为T(n) eg:计算1-100的和 方法一:for循环 T(n) = n + 1 方法二:直接计算 T(n) = 1 时间复杂度 一般情况下,算法中的基本操作语句的重复执行次数时问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n) / f(n) 的极限值为不等于0的常

【C/C++学院】0907-象棋五子棋代码分析/寻找算法以及排序算法

象棋五子棋代码分析 编译代码报错: 错误 1 error MSB8031: Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library. See http://go.microsoft.com/fwlink/p/?LinkId=286820 for mo

STL算法之排序算法

STL排序算法通常复杂度坏于线性,且必须要random-access Iterators. 所以,forward_list, list, associative and unordered contains 不提供随机访问迭代器,这些容器不能用排序算法. 但是,forward_list,list提供了成员函数sort,associative contains 自动排序,unordered contains不能排序. 通常,排序元素一次要比保持元素有序要更快.STL提供了不同的排序算法,根据需求选

c/c++ 通用的(泛型)算法 之 只读算法,写算法,排序算法

通用的(泛型)算法 之 只读算法,写算法,排序算法 只读算法: 函数名 功能描述 accumulate 求容器里元素的和 equal 比较2个容器里的元素 写算法 函数名 功能描述 fill 用给定值,覆盖给定的范围的元素 fill_n 用给定值,覆盖给定开始位置后的,n个元素变 back_inserter 在容器末尾插入元素 copy 把容器1指定范围里的值拷贝给容器2,并返回指向容器2最后一个元素的下个元素 replace 用某个值替换掉给定范围的某个值 replace_copy 用某个值替

算法之排序算法总结

算法之排序算法总结 | Carrie博客 全部 全部 博客 友链 关于 ps:这里的排序都是从小到大进行排列. 冒泡排序 算法思想:从第一个数开始,将两个相邻的数进行比较,如果前一个数大于后一个数,则互换位置,否则保持不变.这样比较一趟,可以把最大的数放在末尾(根据循环的趟数决定).依次循环,直到排序完成. 时间复杂度:O(n^2) 大专栏  算法之排序算法总结li>空间复杂度:O(1) 选择排序 算法思想:从待排序的数字中找出最小的数,放在排序数字的最开始,之后依次在未排序的数字中选出最小的数

数据结构常见的八大排序算法(详细整理)

https://www.jianshu.com/p/7d037c332a9d?utm_campaign=hugo&utm_medium=reader_share&utm_content=note&utm_source=weixin-friends 八大排序,三大查找是<数据结构>当中非常基础的知识点,在这里为了复习顺带总结了一下常见的八种排序算法.常见的八大排序算法,他们之间关系如下: 排序算法.png 他们的性能比较: 性能比较.png 下面,利用Python分别将他

数据结构6种内部排序算法的比较

1.需求分析 (1)输入数据的形式为:伪随机数产生程序产生,且每次输入数不少于100个,至少要用5组不同的输入数据 (2)输出的形式为:输出关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动)的数据 (3)程序能达到的功能:对起泡排序,直接插入排序,简单选择排序,快速排序,希尔排序,堆排序这6种常用的内部排序算法进行比较,比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动) (4)测试数据:正确输入为由伪随机数产生程序产生100个随机数,然后输出比较结果,错

数据结构之常见的排序算法c语言实现

常见的简单排序算法有冒泡排序.选择排序.插入排序.快排.堆排序.归并排序.希尔排序等,这些排序的理论在网上有很多,这就只给出常见的排序算法源码,上学时候写的,不足之处欢迎大家指正. 下面几种排序的主函数入口为:     int main(int argc, char* argv[])         {      int i, len;      int a[] = {8,5,6,4,9,10,3,15,2,17};           len = (sizeof(a) / sizeof(a[0

【数据结构】非比较排序算法(实现计数排序和基数排序)

● 计数排序 1.算法思想: 计数排序是直接定址法的变形.通过开辟一定大小的空间,统计相同数据出现的次数,然后回写到原序列中. 2.步骤: 1)找到序列中的最大和最小数据,确定开辟的空间大小. 2)开辟空间,利用开辟的空间存放各数据的个数. 3)将排好序的序列回写到原序列中. 具体实现如下: void CountSort(int *arr, int size) {  assert(arr);  int min = arr[0];  int max = arr[0];  int num = 0;