[英]Efficient Bubble Sort in C?
我目前正在做一個大學項目來練習指針和數組修改。 要獲得項目的完整 4.0,我需要調整我的冒泡排序代碼以提高效率。 換句話說,我需要 function 在數組成功排序后停止運行排序迭代。 老實說,我被打敗了。 我需要關於如何實現這一目標的所有建議。
我的代碼如下:
int bubbleSortAscend(int *ary, int i, int l) {
for (i = 0; i < l; i++) {
if (*(ary + i) > *(ary + (i + 1))) {
int temp = *(ary + (i + 1));
*(ary + (i + 1)) = *(ary + i);
*(ary + i) = temp;
}
}
}
先感謝您!
知道了。 感謝 ShadowRanger 的建議。 我采納了他的想法並加以考慮。 下面的代碼,以 Boolean 設置為 false 開始,如果無法進行更多排序。 循環將中斷然后打印。 我確信有比我做的更緊湊的方法(我是 C noob :) 但這是它背后的想法:P
編輯:這以前是不正確的。 新代碼:
int bubbleSortAscend(int *ary, int i, int l){
char sorted = false;
l -= 1;
while(sorted == false) {
sorted = true;
for (i = 0; i < l; i++) {
if(*(ary+i) > *(ary+(i+1))) {
int temp = *(ary+(i+1));
*(ary+(i+1)) = *(ary+i);
*(ary+i) = temp;
sorted = false;
}
}
}
printf("Your sorted array is: ");
for(i = 0; i < (l + 1); i++)
printf("%d ", *(ary+i));
printf("\n");
將 sorted 的值更改為 true 現在發生在 for 循環之外,而不是在 else 語句中。 再次感謝大家的幫助。
您的代碼沒有實現冒泡排序,因為您只對數組執行一次傳遞。 此外,您訪問數組末尾以外的元素,不需要第二個參數。
這是一個高效(*)的修改版本,因為它會在數組排序后立即停止:
int bubbleSortAscend(int *ary, int n) {
for (;;) {
int sorted = 1;
for (int i = 0; i < n - 1; i++) {
if (*(ary + i) > *(ary + (i + 1))) {
int temp = *(ary + (i + 1));
*(ary + (i + 1)) = *(ary + i);
*(ary + i) = temp;
sorted = 0;
}
}
if (sorted)
return;
}
}
除非您被要求使用指針語法,否則代碼將以這種方式更具可讀性:
int bubbleSortAscend(int *ary, int n) {
for (;;) {
int sorted = 1;
for (int i = 0; i < n - 1; i++) {
if (ary[i] > ary[i + 1]) {
int temp = ary[i];
ary[i] = ary[i + 1];
ary[i + 1] = temp;
sorted = 0;
}
}
if (sorted)
return;
}
}
(*)高效的冒泡排序是一個非常好的 CS 矛盾修辭法。 冒泡排序的平均時間復雜度為O(n 2 ) ,因此效率不高,但良好的實現在排序列表上具有線性復雜度:比標准歸並排序和快速排序好得多。 事實上,快速排序的簡單實現對於排序列表具有二次復雜性
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.