简单插入排序
/**
* 时间复杂度为O(n^2)
*/
#include<iostream>
using namespace std;
//这里从1号元素开始排序
void InsertSort(int* nums, int len){
int temp;
for(int i=2; i<len; i++)
{
if(nums[i] < nums[i-1])
{
//待排序元素放在0号位置,如果待排序元素当前不是最小,那么提前插入
//如果待排序元素当前是最小,也不会越界,起到哨兵作用
nums[0] = nums[i];
//在有序部分找到合适的地方,让nums[i]插入
for(int j=i-1; nums[j]>nums[0]; j--)
{
nums[j+1] = nums[j];
temp = j;//记录当前后移元素
}
nums[temp] = nums[0];
}
}
}
void show(int* nums, int len){
for(int i=1; i<len; i++){
cout<<nums[i]<<" ";
}
}
int main(){
int nums[10] = {0,22,0,3,4,1,5,3,6,2};
int len = sizeof(nums)/sizeof(nums[0]);
cout<<"数组数据为:";
show(nums,len);
cout<<endl;
InsertSort(nums, len);
cout<<"排序结果为:";
show(nums,len);
return 0;
}
运行结果:
希尔排序
/**
* 希尔排序就是改变步长的插入排序
* 由于拆成多部分操作,若存在相同元素,被划分为不同部分后
* 值相同的元素之间没有联系,故希尔排序不稳定
*/
#include<iostream>
using namespace std;
//这里从0号元素开始排序
void ShellSort(int* nums, int len, int gap){
int temp;//记录待排序元素
int pos;//记录待排序元素可能插入的位置
while( gap >= 1){
//j从gap开始,i前面的元素都是本次步长情况下的第一个元素
for(int i=gap; i<len; i++){
//后面元素小则进行插入排序
if(nums[i] < nums[i-gap]){
temp = nums[i];
for(int j=i-gap; nums[j]>temp&&j>0; j -= gap){
nums[j+gap] = nums[j];//位置j的值已经被移走
pos = j;//将此位置记下,可能为待插入值的位置
}
nums[pos] = temp;
}
}
gap /= 2;
}
}
void show(int* nums, int len){
for(int i=0; i<len; i++){
cout<<nums[i]<<" ";
}
}
int main(){
int nums[10] = {0,22,0,3,4,1,5,3,6,2};
int len = sizeof(nums)/sizeof(nums[0]);
int gap = 4;
cout<<"数组数据为:";
show(nums, len);
cout<<endl;
ShellSort(nums, len, gap);
cout<<"排序结果为:";
show(nums, len);
return 0;
}
运行结果:
排序算法的比较
来源:CSDN
作者:$gamble
链接:https://blog.csdn.net/qq_42500831/article/details/104124948