【问题标题】:C - Insertion Sort AlgorithmC - 插入排序算法
【发布时间】:2019-04-03 02:47:27
【问题描述】:

我正在尝试像这样对一组数字进行排序:

A[]={3,6,7,2,9,1,2,7,2}
A[]={3,6,7,2,2,2,9,1,7}

所以我做了这个:

void sort_min(int* point, int size_array, int min_n){
    int i = 0;
    int j = 0;
    int k = 0;
    while(point[i] != min_n){
        i++;
    }
    j = i+1;
    while(point[j] != min_n){
        j++;
    }
    k = j;
    for (j-1; j > i; j--){
        point[j] = point[j-1];
    }
    point[j] = min_n;
    j = k+1;
}

你可以注意到我从来没有使用过int size_array,因为我不知道如何匹配像a这样的迭代函数 for 或者一个 while(这就是问题所在。如何解决?)。当然,我已经做到了,但我有一个 Segmentation fault 之类的答案。

主要概念是寻找一个数字int min_n,然后在数组中每次出现时对该数字进行排序。

谢谢大家。

【问题讨论】:

  • 这是什么意思? A[]={3,6,7,2,9,1,2,7,2} A[]={3,6,7,2,2,2,9,1,7} 。第二个数组是如何排序的?或者你只是举两个例子。说清楚。
  • 你选错了,我想。阅读一些基础知识。
  • 那么min_n 是什么朋友?再加上你的for 循环不正确......for(j-1..) 它需要是某种赋值语句......比如j=j-1j=size_arr 或其他东西......
  • 正如@Md.MokammalHossenFarnan 所问的那样,两个同名的数组有什么意义?或者如果你说第二个是第一个的排序形式..那是怎么回事?
  • 这是基本。我知道。但我试图得到不同的答案。我的意思是,如果有一个关于更好 编码方式的证明,你的答案可能会很好。我正在尝试获取有关算法的数学方法...另一方面,int_min 是要查找的数字。数组A[] 是明确的。 int 数组。我的意思是int A[]={3,6,7,2,9,1,2,7,2} ... 另一个是相同的,但按照我想要得到的那种方式排序...

标签: c algorithm sorting insertion-sort insertion


【解决方案1】:

如果你问这个问题,你需要使用size_array,如下所示。

  1. 您需要将ijwhile 中的size_array 进行比较。

    while (i < size_array && point[i] != min_n) {
          i++
    }
    
  2. 需要在while 之后检查ij 的值。它们可能大于或等于 size_array。

    while (i < size_array && point[i] != min_n) {
          i++
    }
    
    // I guess when you don't find min_n, function can just return.
    if (i >= size_array)   
           return;
    
    j = i+1;
    while(j < size_array && point[j] != min_n){ // Also need check j's value.
           j++;
    }
    
    // Also guess when can't find the second min_n position, function can return.
    if (j >= size_array) 
           return; 
    
    k = j
    for (; j > i; j--)  // No need j-1.
           point[j] = point[j-1];
    
    // This is useless. When code come here, j == i and point[i] == min_n;
    point[j] = min_n;  
    
    j = k+1;
    

【讨论】:

  • 是的。你明白了主要思想。但就像你注意到的那样,它一次就可以正常工作。就像问题中的示例函数一样。但是我如何匹配第一次出现的每个int min_n 号码?就是这个问题。
【解决方案2】:

使用以下代码尝试插入排序..

void sort_min(int point[], int size_array) 
{ 
   int i, key, j; 
   for (i = 1; i < size_array; i++) 
   { 
       key = point[i]; 
       j = i-1; 

       /* Move elements of arr[0..i-1], that are 
          greater than key, to one position ahead 
          of their current position */
       while (j >= 0 && point[j] > key) 
       { 
           point[j+1] = point[j]; 
           j = j-1; 
       } 
       point[j+1] = key; 
   } 
} 

【讨论】:

  • 为什么投反对票?这是一个完全合理的插入排序
  • 哦,完全合理,我明白了。请解释 for 循环 @AndrewScott 先生。什么基本的c 编程教你这种循环? forj-1?
  • 我只想对一个数字进行排序...在主要问题中,数组 A[] 按第一次出现的 2 个数字排序...但不会丢失数据...
  • 对不起@Karl,你能解释一下吗?我没有完全明白那部分,。所以你说数字2 是从它的第一次出现开始排序的......其余的都没有改变......如果我错了,请纠正我......
  • "Rai 是的,你是对的...我不想移动数组中的主顺序。只需 数字以对另一个 int min_n 开始排序它的第一次出现。查找、移动和排序...查找、移动和排序...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 1970-01-01
相关资源
最近更新 更多