昨天室友讓我幫忙寫道考研輔導題,這道題主要就是考鍊錶的排序,由於沒有時間限制,就直接暴力破解了,後面抽時間再總結一下鍊錶的排序幾種演算法。
用c語言寫這種資料結構的問題,最大的問題就是構造資料結構,這裡我構造了乙個單向鍊錶儲存員工資訊,由於沒有限制長度,這裡我以『-』作為輸入結束的標誌,在這裡最難的點就是對於輸入的理解(scanf\getchar())。
輸入函式:
list readinput() /* 輸入,帶頭結點 */
scanf("%c", &p->id[i]);
if(p->id[i] == ' ' || p->id[i] == '\n')
} if(f == 1)
for(i = 0; i < 19 ; i++) // 錄入姓名,空格說明結束
} scanf("%f", &p->wage); // 錄入工資
// puts(p->id);
// puts(p->name);
// printf("%.2f\n", p->wage);
}return l; // 返回頭結點
}
其實**可以寫的更簡潔些,尤其是在從第二行開始消除回車影響以及判斷輸入結束條件這部分!
輸出函式:
void print(list l)
}
求鍊錶長度:
int length(list l)
return i;
}
排序:
list sort(list l) // 按工資排序
} }
free(t);
}
後面再將其他幾種排序演算法加進去,爭取將時間複雜度降到最低。
求中位數:
float f(list l, int len)
else
}
主函式:
int main()
源程式:
#include #include #include struct salary;
typedef struct salary *list;
int length(list l); /* 求鍊錶長度 */
list readinput(); /* 輸入 */
list sort(list l); /* 排序 */
float f(list l, int len); /* 員工工資中位數 */
void print(list l); /* 輸出 */
int main()
list readinput() /* 輸入,帶頭結點 */
scanf("%c", &p->id[i]);
if(p->id[i] == ' ' || p->id[i] == '\n')
} if(f == 1)
for(i = 0; i < 19 ; i++) // 錄入姓名,空格說明結束
} scanf("%f", &p->wage); // 錄入工資
// puts(p->id);
// puts(p->name);
// printf("%.2f\n", p->wage);
}return l; // 返回頭結點 }
void print(list l)
}list sort(list l) // 按工資排序
} }
free(t);
} int length(list l)
return i;
} float f(list l, int len)
else
}
php 實現鍊錶的排序
leetcode 148 排序乙個無序鍊錶 說明 1.通過快慢指標找到鍊錶的中間位置,low 表示右邊鍊錶 2.左邊鍊錶理解起來就比較費事了。左邊鍊錶 因為物件賦值是引用拷貝。所以,當 low 變化的時候,head 會記錄變化,通過 low next null 終止變化,得到左鍊錶。2.然後再通過有...
leetcode 鍊錶的排序問題
題目描述 在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。例如 輸入 4 2 1 3 輸出 1 2 3 4。思路分析 因為要求在o nlogn 的時間複雜度,所以想到使用歸併排序。下面對歸併排序做個介紹。歸併排序 基本方法如下 1 把待排序序列的n個記錄看成n個有序子串行,每...
排序演算法 鍊錶實現
陣列的高效體現於隨機訪問,插排 快排等排序演算法未用到這一特點,故這兩種排序演算法可基於鍊錶實現 插入排序 迭代器 p順序訪問鍊錶 迭代器 i順序訪問前 p 個元素 主要的操作為 當p i p.value刪除原位置的 p將p插入 i 1 與 i 之間 若為單向鍊錶,儲存 i 1與 p 1 演算法複雜...