[英]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.