服务器之家

服务器之家 > 正文

浅谈2路插入排序算法及其简单实现

时间:2021-03-06 14:15     来源/作者:zinss26914

2路插入排序算法是在直接插入排序算法的基础上增加了一个辅助数组,其目的是减少排序过程中的移动次数,需要增加n个记录的辅助空间。

难点可能在于对取余的考虑吧,可以把辅助数组看成一个环状空间,这样就能更好的理解辅助空间中最大值和最小值的位置了。

算法整体思想还是很简单的,直接贴出可运行代码,注释还是挺清楚的,大家直接看就ok了

C语言实现示例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <stdio.h>
#include <stdlib.h>
 
void insert_sort(int *arr, int *temp, int n)
{
  int i, first, final, k;
 
  first = final = 0;
  temp[0] = arr[0];
 
  for (i = 1; i < n; i ++) {
    if (arr[i] < temp[first]) { // 待插入元素比最小的元素小
      first = (first - 1 + n) % n;
      temp[first] = arr[i];
    } else if (arr[i] > temp[final]) { // 待插入元素比最大元素大
      final = (final + 1 + n) % n;
      temp[final] = arr[i];
    } else { // 插入元素比最小大,比最大小
      k = (final + 1 + n) % n;
      while (temp[((k - 1) + n) % n] > arr[i]) {
        temp[(k + n) % n] =temp[(k - 1 + n) % n];
        k = (k - 1 + n) % n;
      }
      temp[(k + n) % n] = arr[i];
      final = (fianl + 1 + n) % n;
    }
  }
 
  // 将排序记录复制到原来的顺序表里
  for (k = 0; k < n; k ++) {
    arr[k] = temp[(first + k) % n];
  }
}
 
int main(void)
{
  int i, n, *arr, *temp;
 
  while (scanf("%d", &n) != EOF) {
    arr = (int *)malloc(sizeof(arr) * n);
    temp = (int *)malloc(sizeof(temp) * n);
 
    for (i = 0; i < n; i ++)
      scanf("%d", &arr[i]);
 
    insert_sort(arr, temp, n);
 
    for (i = 0; i < n; i ++)
      printf("%d ", arr[i]);
    printf("\n");
    free(arr);
    free(temp);
  }
 
  return 0;
}

  
同时附上C++写法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<iostream>
using namespace std;
#define MAX 20
void PrintArray(int a[],int len){
 for(int i=0;i<len;i++)
 cout<<a[i]<<" ";
 cout<<endl;
}
void BinInsertSort(int a[],int len){
 int *d=(int *)malloc(len*sizeof(len));
 for(int i=0;i<len;i++)
 d[i]=0;
 int first=0,final=0;
 d[0]=a[0];
 for(int i=1;i<len;i++){
 if(a[i]<=d[first]){
  first=(first-1+len)%len;
  d[first]=a[i];
 }
 else if(a[i]>=d[final]){
  final=final+1;
  d[final]=a[i];
 }
 else{
  int j=final++;
  while(a[i]<d[j]){
  d[(j+1)%len]=d[j];
  j=(j-1+len)%len;
  }
  d[j+1]=a[i];
 }
 }
 cout<<"辅助数组中排序结果为:";
 PrintArray(d,len);
}
int main(){
 int a[MAX],len;
 cout<<"请输入待排序的元素个数:";
 cin>>len;
 cout<<"请输入待排序的元素:";
 for(int i=0;i<len;i++)
 cin>>a[i];
 BinInsertSort(a,len);
 system("pause");
 return 0;
}
标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部