簡體   English   中英

C-對字符串進行冒泡排序數組,然后應用於無符號int數組

[英]C - Bubble sort array of character strings, then apply to unsigned int array

該程序應該獲取一個文件,例如data.dat,其中填充了多達320個單詞的列表,這些單詞均小於或等於29個字符(其中30個為空字符),並將每個單詞添加到全局數組中。 然后,我想用冒泡排序按字母順序對列表進行排序。 我這樣做是在其自己的文件sort.c中使用以下功能

#include "set.h"
#include "sortAndSearch.h"
#include <stdio.h>
#include <ctype.h>
#include <string.h>

void bubbleSort(char A[][30], int num) {
int i, j;
char temp[30];

for(i = 0; i < num; i++)
    for(j = 0; j < num-1; j++)
        if(strcmp(A[i], A[i+1]) > 0){
            //swap the two array elements
            strcpy(temp, A[j]);
            strcpy(A[j], A[j+1]);
            strcpy(A[j+1], temp);
        }
}

我需要一組未簽名的整數

unsigned int Set[10];

作為名稱數組的索引。 因此,每個無符號整數都有32位,並且有10個無符號整數(總共320位),每個位將引用一個字。 我不確定如何處理這一部分。

最終目標是創建用於操作集合的函數。 我覺得如果我可以減少排序和索引的話,我可以攻擊自己,因為我做了類似的事情,但是沒有使用字符數組。 定義要使用的功能的頭文件set.h的內容如下

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

// defining new type(s)
typedef unsigned int Set[10];

// declaring global variable(s)
extern char names[320][30];

extern void setUnion(Set set1, Set set2, Set result);
extern void setIntersection(Set set1, Set set2, Set result);
extern void clearSet(Set set);
extern void add2Set(Set set, int value);
extern void deleteFromSet(Set set, int value);
extern int isMember(Set set, int element);
extern void printSet(Set);
extern int nameIsMember(Set set, char *);
extern void addName2Set(Set set, char *);
extern void deleteNameFromSet(Set set, char *);

這是頭文件sortAndSearch.h的內容

void bubbleSort(char A[][30], int num);

int binarySearch(char A[][30], char *, int, int );

實際上,您的氣泡排序不是氣泡排序。 它僅對數組進行一次傳遞。 您需要反復遍歷數組,直到進行不導致交換的遍歷為止。 到那時,您知道陣列已排序。

我首選的冒泡排序實現有一個外部do循環。 內部循環與您當前的狀態相同。 當最新的內部循環執行未能交換任何項目時,外部循環終止。

當然,從長遠來看,我建議使用更好的排序算法,但這可能是一項家庭作業。

問題出在這部分:

for(i = 0; i < num-1; i++)
        if(strcmp(A[i], A[i+1]) > 0){
            //swap the two array elements
            strcpy(temp, A[i]);
            strcpy(A[i], A[i+1]);
            strcpy(A[i+1], temp);
        }

冒泡排序應該有兩個循環! ;-)例如,請參見此處的整數。

Bubblesort執行不正確。 應該有一個內循環和一個外循環。

我不清楚320位集合的用途:它不能用於排序,或用於其他任何東西,除了每個位都表明數組的某些屬性為真(例如它是否存在,是否包含動詞或一些東西。

總結名稱排序獨立於設置操作是否公平?

只要名稱不變,設置操作是否有效?

您列出的操作分為以下幾類:

直集運算,不管它們是什么集合。 它們一次在整個集合上運行:

extern void setUnion(Set set1, Set set2, Set result);
extern void setIntersection(Set set1, Set set2, Set result);
extern void clearSet(Set set);

您可以解決這些問題而不必擔心集合可能意味着什么,但是您將需要一些值,以便能夠對其進行編碼或使用。

Set元素操作,這些操作集合中的單個位,並且再也不在乎這些位代表什么:

extern void add2Set(Set set, int value);
extern void deleteFromSet(Set set, int value);
extern int isMember(Set set, int element);

這是一個很好的起點。

這些操作在名稱和集合之間進行映射,因此需要更多工作:

extern int nameIsMember(Set set, char *);
extern void addName2Set(Set set, char *);
extern void deleteNameFromSet(Set set, char *);

我不確定extern void printSet(Set); 意思是,它會打印出集合中的名稱嗎?

好,一套是

unsigned int s[10];

為了測試一點,我們需要將一個int值轉換為一個int的索引,以及該int內的位。 最簡單的方法是數組索引=(值/ 32),位偏移量是(值%32)。 編譯器應該很好地做到這一點,所以不必擔心效率。

要獲得s中的位值:(s [((value / 32)]&(1 <<(value%32))

那么您了解位運算符嗎?

~ not
& and
| or
^ xor
<< left shift
>> right shift

它們是您將用於設置,清除和更改集合中位的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM