轉:
http://kkiick.com/viewthread.php?tid=25074
這個因為前陣子有接觸到演算法,看到有人寫了這個小東西覺得蠻有趣的,
所以轉過來分享一下...
有沒有人想用 QuickSort 來寫一個看看阿XD?
相信有人在怒物品過濾時常常會有困擾就是丟太多東西造成全部道具過濾這邊我有寫個排序整理程式 單純用氣泡排序的功能
載點:http://tinyurl.com/acudzus 載完放在 //破盾資料夾/Data/
如果怕有毒的話我附程式碼 自己找組譯器組譯
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- typedef struct Maple {
- int id;
- char line[100];
- }maple;
- int main(void){
- //程式開始
- printf("過濾道具檔整理程式 \n");
- maple data[10000];
- int DataLen = 0;
- FILE *fp;
- //讀取道具檔
- fp = fopen("CrackShieldItemList.List", "r");
- while (!feof(fp)) {
- char s[100];
- fgets(data[DataLen].line, sizeof(data[DataLen].line), fp);
- sscanf(data[DataLen].line, "%d;%s\n", &data[DataLen].id, s);
- DataLen++;
- }
- fclose(fp);
- //氣泡排序法
- int Lenght = DataLen;
- while(--Lenght!=0) {
- int i;
- for(i = 0; i != Lenght; i++) {
- int tmp;
- char s[100];
- if(data[i].id < data[i + 1].id) {
- tmp = data[i].id;
- data[i].id = data[i + 1].id;
- data[i + 1].id = tmp;
- strcpy(s,data[i].line);
- strcpy(data[i].line,data[i+1].line);
- strcpy(data[i + 1].line, s);
- }
- if(data[i].id == data[i + 1].id)
- data[i].id = 0;
- }
- }
- //檔案輸出
- fp = fopen("CrackShieldItemList.List", "w");
- for (DataLen--; DataLen >= 0; DataLen--) {
- if (data[DataLen].id != 0)
- fprintf(fp, "%s", data[DataLen].line);
- }
- fclose(fp);
- //整理完畢
- printf("Success!\n");
- system("PAUSE");
- return 0;
- }
複製代碼
|
手癢試改一下複習Sort
回覆刪除不過我沒用過破盾,不知能不能用XD
#include
#include
typedef struct Maple {
int id;
char line[100];
}maple;
void QuickSort( Maple arr[], int left, int right )
{
if( left < right )
{
int i = left;
int j = right+1;
while( true )
{
while( ++i <= right && arr[i].id >= arr[left].id );
while( --j > left && arr[j].id <= arr[left].id );
if( i>=j )
{
break;
}
arr[i].id ^= arr[j].id ^= arr[i].id ^= arr[j].id;
for( int k = 0; k < 100; k++ )
{
arr[i].line[k] ^= arr[j].line[k] ^= arr[i].line[k] ^= arr[j].line[k];
}
}
if( j != left )
{
arr[left].id ^= arr[j].id ^= arr[left].id ^= arr[j].id;
for( int k = 0; k < 100; k++ )
{
arr[left].line[k] ^= arr[j].line[k] ^= arr[left].line[k] ^= arr[j].line[k];
}
}
QuickSort( arr, left, j-1 );
QuickSort( arr, j+1, right );
}
}
int main(void){
//程式開始
printf("過濾道具檔整理程式 \n");
static maple data[10000];
int DataLen = 0;
FILE *fp;
//讀取道具檔
fp = fopen("CrackShieldItemList.List", "r");
while (!feof(fp))
{
char s[100];
fgets(data[DataLen].line, sizeof(data[DataLen].line), fp);
sscanf(data[DataLen].line, "%d;%s\n", &data[DataLen].id, s);
DataLen++;
}
fclose(fp);
//氣泡排序法
//QuickSort
DataLen -= 2;
QuickSort(data,0,DataLen);
//檔案輸出
fp = fopen("CrackShieldItemList.List", "w");
fprintf(fp, "%s", data[DataLen--].line);
for ( ; DataLen >= 0; DataLen-- )
{
if (data[DataLen].id != data[DataLen+1].id)
{
fprintf(fp, "%s", data[DataLen].line);
}
}
fclose(fp);
//整理完畢
printf("Success!\n");
system("PAUSE");
return 0;
}
測試了一下好像有錯誤XD
刪除看了一下輸出檔好像只儲存到最後一次比對的結果...
刪除這樣啊..可能要借我一個CrackShieldItemList.List來測試才知,或是說一下檔案的格式是什麼,我是依原始碼讀入的方式去猜應該是
刪除CrackShieldItemList.List:
ID1;名稱1
ID2;名稱2
ID3;名稱3
ID4;名稱4
ID5;名稱5
的前提下去寫的XD,這樣做出來是沒問題
2000000;紅色藥水
刪除2060000;箭矢
2061000;弩箭矢
1061029;紅夢褲
2010009;青蘋果
2511087;鋒利貴族肩膀製作法
2940000;女媧的黃土副產物
4000443;有裂痕的沙漏
4001515;豹紋卷碎片
4170025;英雄鑰匙
1040004;藍修煉服
1002017;褐色舊魔法帽
2511052;狼粉色項墜製作法
2440001;吃蟲寶石君
2440000;吃蟲桔小姐
2512245;提昇的 2階段 攻擊力藥丸製作說明書
4310015;鬥神的象徵
4001521;老虎紋卷碎片
我換VS編譯通過,沒問題...
刪除我的wxDevC++怪怪的...看來還是灌回舊版好了XD
試了一下還是沒問題0.0,難道是環境不同有差嗎,,用原碼跟我的執行的結果一樣XD
刪除看了一下發現回文的include後面的沒顯示出來,不過我想也不是這個的關係XD
#include
#include
我回太慢了XD..我是用vs 2010
刪除