通过冒泡排序机制得到两个簇

Obtain two cluster via bubble sort mechanism

我正在尝试通过冒泡排序算法从字符串中获取两个簇。主要逻辑是字符串在左边,数字在右边,不能按照从右到左的顺序改变位置,而且这个实现需要用到冒泡排序(!)

例如;

如果字符串是'503692EC12FATMA',我需要首先把它写成'ECFATMA50369212',但我不明白除了一个if语句之外我如何使用冒泡排序来实现这个机制?

我尝试了一些方法,但我总是通过冒泡排序对字符数组进行排序我无法存储旧位置,我只需要使用一个数组并且它需要是 C 的实现。

我的代码示例:

#include<stdio.h>
#include<conio.h>
#include<string.h>
void main()
{
  char st[25],temp;
  int l,i,j;
 // clrscr();

  printf("enter Any Sting\n");
  gets(st);
  l=strlen(st);
  /*Logic Bubble Sort  */
  for(i=1;i<l;i++)
     for(j=0;j<l-i;j++)
    if(st[j]>st[j+1])
    {
       temp=st[j];
       st[j]=st[j+1];
       st[j+1] =temp;
    }
  printf("sorted string  \n");
  printf("%s",st);
  getch();
}

但这给了我:'01223569AACEFMT' (!)

在我制作字符串 'ECFATMA50369212' 之后,我将使用此字符串从左到右排列一个簇 A < B 和 0 < 1。

至:'AACEFMT01223569'

像两个函数一样,第一个函数,使用冒泡排序对数字和字符进行划分,然后使用这个函数返回的数组从右到左比较它进行排序以创建排序的字符数组。

如有任何帮助,我们将不胜感激。

我认为您的代码的问题在于您根据字符的 ASCII 值对数组进行冒泡排序,其中大写字母(以及小写字母)在 个字符之后出现

你可以做些什么来让你的程序工作是定义你自己的比较函数,你可以在其中处理数字字符(48 <= ASCII 代码 <= 57)和大写字母字符(65 <= ASCII 代码<= 90) 不同。

这不是冒泡排序算法。您要做的只是一个字符串操作,可以像这样完成:

#include<stdio.h>
#include<conio.h>
#include<string.h>
void main()
{
  char st[25],temp;
  int l,i,j;
 // clrscr();

  printf("enter Any Sting\n");
  gets(st);
  int i;
  char sorted_st[25];
  int str_index = 0;
  for (i = 0; i < strlen(l); ++i) {
    if((l[i] >= 'a' && l[i] <= 'z') ||
       (l[i] >= 'A' && l[i] <= 'Z')) {
      sorted_st[str_index++] = l[i];
    }
  }
  for (i = 0; i < strlen(l); ++i) {
    if(l[i] >= '0' && l[i] <= '9') {
      sorted_st[str_index++] = l[i];
    }
  }
  // add the terminating zero
  sorted_st[str_index++] = '[=10=]';
  printf("sorted string  \n");
  printf("%s",st);
  getch();
}

建议:您的主要功能最好是 return int。成功执行应该 return '0',在其他情况下错误代码。

int main() {
  /* code */
  return 0;
} 

我想这是你的作业,你实际上需要某种 buble 类型的排序来首先进行聚类,而不是实际排序,这里是示例版本,其中 "bubbles" 字母到字符串的开头,保留他们的相对位置:

l = strlen(st);
for (i = 1; i < l; i++)
    if (isAlpha(st[i])) // bubble this letter to the beginning of the string
        for (j = (i - 1); (j >= 0) && !isAlpha(st[j]); j--)
            swap(&st[j + 1], &st[j]);

printf("sorted string\n%s\n", st);

注意:您需要在 main 之前执行以下 2 个函数:

char isAlpha(char a) {
    return (a >= 'A') && (a <= 'Z');
}

void swap(char* a, char *b) {
    char t = *a; *a = *b; *b = t;
}

要一次完成此操作,需要区分数字和非数字。一旦你有了它,算法可以总结为:

  • 如果您在第一个插槽中有数字而在第二个插槽中没有数字,请始终交换。
  • 否则,只有当它们的两个个数字或两个个非数字时才交换,然后,只有当它们乱序时(较高的插槽是 "less than" 较低的插槽)。

之后,您可以在一个气泡中完成此操作-运行。一切都是关于适当的比较:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main()
{
    char st[25] = "503692EC12FATMA", temp;
    size_t len, i;
    int swapped = 1;

    puts(st);
    len = strlen(st);

    while (swapped && len--)
    {
        swapped = 0;
        for (i=0; i<len; ++i)
        {
            int swap = !isdigit((unsigned char)st[i+1]);
            if (isdigit((unsigned char)st[i]))
                swap = swap || (st[i+1] < st[i]);
            else
                swap = swap && (st[i+1] < st[i]);

            if (swap)
            {
                temp = st[i];
                st[i] = st[i+1];
                st[i+1] = temp;
                swapped = 1;
            }
        }
    }

    puts(st);
}

输出

503692EC12FATMA
AACEFMT01223569

显然还有其他方法可以做到这一点。如果你是一个受虐狂,你甚至可以将所有的疯狂组合成一个单一的 if 表达式(为了清楚起见,我没有这样做)。但是要完成 聚类和聚类排序,这是实现它的一种方法。