我必須讀取一個.txt檔案并將它們寫入檔案的單詞和時間保存在一個結構陣列中。我試圖在互聯網上尋找一種方法來做到這一點,但一切都是關于 C 的。
其他一切似乎都運行良好。單詞毫無問題地保存在陣列中,但排序根本不起作用。
結構:
typedef struct
{
char palavra[50]; // the word
int ocorrencia; // times it's written
} dicionario;
我嘗試進行快速排序:
void quickSort(dicionario tabela[], int inicio, int tamanho)
{
int i = inicio, j = tamanho;
int temp;
int pivot = tabela[(i j) / 2].ocorrencia;
while(i<=j)
{
while(tabela[i].ocorrencia < pivot) i ;
while(tabela[j].ocorrencia > pivot) j--;
if(i<=j)
{
temp = tabela[i].ocorrencia;
tabela[i].ocorrencia = tabela[j].ocorrencia;
tabela[j].ocorrencia = temp;
i ;
j ;
}
}
if(inicio < j) quickSort(tabela,inicio,j);
if(i < tamanho) quickSort(tabela,i,tamanho);
}
當我運行代碼時,它只是結束而不回傳任何內容,即使我嘗試在最后列印它。
uj5u.com熱心網友回復:
wandbox 示例對指向字串的指標陣列進行排序。您想對結構陣列進行排序,例如dicionario a[20];在.ocorrencia欄位上。你打電話
qsort(a, 20, sizeof(dicionario), cmpdicionario);. 然后使用:
int cmpdicionario(const void *a, const void *b)
{
// a and b are really pointers to structs.
int ai = ((dicionario *)a)->ocorrencia;
int bi = ((dicionario *)b)->ocorrencia;
return (ai < bi) ? -1 : (ai > bi) ? 1 : 0;
}
將比較函式放在呼叫 qsort() 之前以保持簡單。
如果您沒有足夠高的計數來擔心溢位,您可以,return ai - bi;但我推薦上述方法。
我沒有研究過你的快速排序。做對是一件棘手的事情。如果您需要自己撰寫代碼,您應該密切關注一個已知的好示例。我會注意到你的j 應該是j--,并且你的交換應該交換整個結構,而不僅僅是一個欄位,因為你想保持單詞與它們的計數相關聯。可能還有其他錯誤。
此外,如果您需要撰寫自己的排序代碼,并且不需要高性能,請使用 Shell 排序。它更短,更容易正確。并且通常大約是快速排序速度的 1/5 到 1/2,通常足夠快。如果它少于 50 個元素并且您不需要經常運行它,則插入排序很好,甚至更簡單。另外,插入排序是“穩定的”,也就是說,它會將具有相同計數的元素保持在其原始順序中。在這里可能不相關,但有時它很有用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/437132.html
下一篇:按升序對ips串列進行排序
