雞尾酒排序 氣泡排序最終版

2021-09-27 02:38:20 字數 1581 閱讀 1075

雞尾酒排序:每一輪首先從前往後遍歷出乙個最大值放在最後面,然後從後往前遍歷乙個最小值放在最前面,即每一輪遍歷選出乙個最大值和乙個最小值。

適合用於大部分元素已經有序的情況

時間複雜度和空間複雜度?是否穩定性?

簡單粗暴的雞尾酒排序:

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...