雞尾酒排序:每一輪首先從前往後遍歷出乙個最大值放在最後面,然後從後往前遍歷乙個最小值放在最前面,即每一輪遍歷選出乙個最大值和乙個最小值。
適合用於大部分元素已經有序的情況
時間複雜度和空間複雜度?是否穩定性?
簡單粗暴的雞尾酒排序:
public static void jiweijiu1(int a)
}//從後往前遍歷,選出最小值,外迴圈每遍歷一次,
前面和後面分別多增加乙個有序值。故這裡
int k = a.length-1-i; k > i;
for (int k = a.length-1-i; k > i; k--)
}} }
第一次優化:進行內層迴圈的時候,只要存在一次遍歷(從前往後遍歷或者從後往前遍歷)沒有交換元素則認為陣列有序
public static void jiweijiu2(int a)
}if (issorted)
issorted = true;
//從後往前遍歷,選出最小值,外迴圈每遍歷一次,
前面和後面分別多增加乙個有序值。故這裡
int k = a.length-1-i; k > i;
for (int k = a.length-1-i; k > i; k--)
}if (issorted)
} }
第二次優化:進行內層迴圈遍歷的時候,可以找到有序無序的邊界下標index,來減少內層迴圈次數
自己寫的,沒有考慮到 j 和 k 的初始值,這裡還可以在優化一下。
public static void jiweijiu3(int a)
}if (issorted)
//迴圈中最後一次交換元素時的下標就是有序無序邊界
qiantohouindex = changeqthindex;
//後往前
issorted = true;
for (int k = a.length-1-i; k > houtoqianindex; k--)
}if (issorted)
houtoqianindex = changehtqindex;
} }
考慮 j 和 k 初始值後如下,只修改了內迴圈中的兩個for語句對 j 和 k 初始值賦值
每次外迴圈既可以確定陣列前面部分的有序邊界index,也可以確定後面部分的有序邊界index,所有可以再次優化。
public static void jiweijiu3(int a)
}if (issorted)
//迴圈中最後一次交換元素時的下標就是有序無序邊界
qiantohouindex = changeqthindex;
//後往前
issorted = true;
for (int k = qiantohouindex; k > houtoqianindex; k--)
}if (issorted)
houtoqianindex = changehtqindex;
} }
氣泡排序 雞尾酒排序
include 交換函式 void swap int a,int i,int j 列印陣列 void printa int a,int len printf n 氣泡排序 int main1 int len sizeof a sizeof a 0 int i,j 外層迴圈控制輪數,每一輪找出乙個最大...
氣泡排序公升級版 雞尾酒排序
雞尾酒排序等於氣泡排序的輕微變形,不同的地方在於從低到高然後從高到低,而氣泡排序則僅從低到高去比較序列裡的每個元素。他可以得到比氣泡排序稍微好一點的效能,原因是氣泡排序只從乙個方向進行比對 由低到高 每次迴圈只移動乙個專案。雞尾酒排序演算法的運作如下 從左到右,將最小的放到左邊 for int i ...
氣泡排序案例,雞尾酒排序
概念 依次比較相鄰的兩個數,將小數放在前面,大數放在後面 第一趟可得到 將最大數放到最後一位,第二趟可得到 將第二大的數放到倒數第二位,如此下去,重複以上過程,直至最終完成排序。由於排序過程中,總是將小數往前放,大數往後放,相當於氣泡往上公升,所以稱作氣泡排序。思路 用二重迴圈實現,外迴圈變數設為i...