C++实现插入排序(直接,二分,希尔)
简介:
插入排序的基本思想是将一个待排序的记录按照关键字的大小插入前面已经排好序的子序列中,直到全部记录插入完成
直接插入排序
在插入的过程中采用顺序遍历,时间复杂度o(n2),空间复杂度o(1),排序是稳定的
void Sort::sequence_search_insert(){
//前半部分有序,后部分是无序的,每次将元素插入有序的部分来完成排序
for(int i=0;i<len;i++){
int record = i;
for(int j=0;j<i;j++){
if(nums[record]<nums[j]){
record = j;
break;
}
}
int item = nums[i];
for(int j=i;j>record;j--){
nums[j]=nums[j-1];
}
nums[record] = item;
}
print();
}
二分查找插入排序
在查找的过程中,不采用顺序遍历而是使用二分查找,仅仅减少了查找的次数,总的时间复杂度没有大的变化。时间复杂度o(n2),空间复杂度o(1),排序是稳定的
void Sort::bianry_search_insert(){
for(int i=0;i<len;i++){
int j=0;
int k=i;
while(j<=k){
int mid=(j+k)/2;
if(nums[mid]>=nums[i]){
k = mid-1;
}else{
j = mid+1;
}
}
int item = nums[i];
for(k=i;k>j;k--){
nums[k]=nums[k-1];
}
nums[j]=item;
}
print();
}
shell sort(希尔排序)
时间复杂度o(n1.3) ~ o(n2),空间复杂度o(1),排序是不稳定的
参考:shellsort
void Sort::shell_sort(){
for(int gap = len/2; gap>=1 ; gap/=2){
for(int i=gap;i<len;i++){
int item = nums[i];
int j=i;
for(;j>=gap&&item-nums[j-gap]<0;j-=gap)
{
nums[j] = nums[j-gap];
}
nums[j]=item;
}
}
print();
}
测试代码
#include<bits/stdc++.h>
using namespace std;
class Sort{
private:
int* nums;
int len;
void print(){
for(int i=0;i<len;i++){
cout<<nums[i]<<" ";
}
cout<<endl;
}
public:
Sort(int* num, int len){
this->nums = num;
this->len = len;
}
void sequence_search_insert();
void bianry_search_insert();
void shell_sort();
};
void Sort::sequence_search_insert(){
//前半部分有序,后部分是无序的,每次将元素插入有序的部分来完成排序
for(int i=0;i<len;i++){
int record = i;
for(int j=0;j<i;j++){
if(nums[record]<nums[j]){
record = j;
break;
}
}
int item = nums[i];
for(int j=i;j>record;j--){
nums[j]=nums[j-1];
}
nums[record] = item;
}
print();
}
void Sort::bianry_search_insert(){
for(int i=0;i<len;i++){
int j=0;
int k=i;
while(j<=k){
int mid=(j+k)/2;
if(nums[mid]>=nums[i]){
k = mid-1;
}else{
j = mid+1;
}
}
int item = nums[i];
for(k=i;k>j;k--){
nums[k]=nums[k-1];
}
nums[j]=item;
}
print();
}
void Sort::shell_sort(){
for(int gap = len/2; gap>=1 ; gap/=2){
for(int i=gap;i<len;i++){
int item = nums[i];
int j=i;
for(;j>=gap&&item-nums[j-gap]<0;j-=gap)
{
nums[j] = nums[j-gap];
}
nums[j]=item;
}
}
print();
}
int main(){
int nums[10]={9,5,1,3,4,7,6,8,2,3};
Sort test(nums,10);
test.sequence_search_insert();
test.bianry_search_insert();
test.shell_sort();
}