內功修煉之O n 的排序演算法(一)

2021-08-17 05:59:29 字數 1828 閱讀 9841

*本文參考程式設計師內功修煉課程,所有實現**均能在github上找到。

一、選擇排序(selection sort)

1) 基本思想:給定陣列int arr=;第

1趟排序,在待排序資料arr[1]~arr[n]

中選出最小的

資料,將它與arr[1]

交換;第

2趟,在待排序

資料arr[2]~arr[n]

中選出最小的

資料,將它與ar

r[2]

交換;以此類推,第

i趟在待排序

資料arr[i]~arr[n]

中選出最小的

資料,將它與

r[i]

交換,直到全部排序完成。

2 )  **實現:

public class selectionsort 

public static void selectionsort(int array)

}if (minindex != i)

} }private static void swap(int array, int i, int minindex)

}

3) 演算法分析:演算法核心在於找到帶排序元素中的最小值。

1. 我們記錄待排序元素中最小值的索引,開始假定待排序的元素中第乙個元素是最小值,繼續往後遍歷;

2. 如果有元素小於索引處的值,則將索引修改為該元素索引;

二、 插入排序(insertion sort)

1) 基本思想:  給定陣列int arr=;第

1趟排序,將arr[1]和arr[0]比較

,將最小值排在前;第2

趟,將arr[2]插入已排好序的arr[0]~arr[1]中合適的位置

;以此類推,第

i趟將arr[i]插入已排好序的

arr[0]~arr[i-1]

中合適的位置

,直到全部排序完成。

2) **實現:

public class insertionsort 

public static void insertionsort(int arr)

arr[j] = current;

} }}

3) 演算法分析:演算法核心在於將待排序元素插入已排序元素中合適的位置。

1. 記錄待排序元素值,將記錄元素前一位已排好序的元素與記錄元素進行比較:如果大於記錄值,則將前一位元素後移,索引前移;如果小於記錄值, 將當前索引處的值置為記錄值。

三、氣泡排序(bubble sort)

1) 基本思想:給定陣列int arr=;第

1趟排序,將arr[0]和arr[1]比較

,如果arr[0]>arr[1],交換兩者位置;第2

趟,將arr[1]和arr[2]比較,如果arr[1]>arr[2],交換兩者位置;第i

趟,將arr[i-1]和arr[i]比較,如果arr[i-1]>arr[i],交換兩者位置;以此類推,

直到全部排序完成。

2) **實現:

public class bubblesort 

public static void sort(int arr)

}} }

private static void swap(int arr, int j, int i)

}

3) 演算法分析:此處對於原本的冒泡演算法做了優化:如果沒有再進行位置交換說明陣列已經有序,此時終止排序。這樣對於完全有序的陣列排序效率提公升巨大;對於基本有序陣列,效率略有提公升。

修煉演算法內功 選擇排序(一)

內容 1 簡單的選擇排序 2 使用模板 泛型 使演算法更加靈活 3 使用結構體完成學生的name和score屬性的排序 4 隨機生成演算法測試用例。寫在前面 為什麼學習o n 2 的排序演算法?基礎 1 selection sort 選擇排序 基本思路 如 8 6 2 3 1 5 7 4 對乙個序列...

修煉演算法內功 插入排序(一)

1 最切合實際的例子 在我們生活中,常見的撲克牌就是乙個很好的例子。正常人抓牌通常都是如下的幾個步驟 抓取第一張排放在手中 抓取第二張牌與第一張做比較,如果比第一張大則放在左邊,反之,右邊。放在哪邊是個人習慣務必較真 抓取第三張先與第一張比較,大左小右 再與第二張比較,大左小右。重複抓取並迴圈比較,...

修煉演算法內功 歸併排序(一)

內容 歸併排序演算法思想 歸併排序演算法的實現 歸併排序演算法的優化 1 歸併排序演算法思想 對於給定的一串陣列如 5 3 7 2 6 4 8 1 我們可以進行如下幾個步驟 將陣列從中間分成兩組陣列 5 3 7 2和6 4 8 1分別排序 同樣,我們可以繼續拆分這兩個陣列為5 3和7 2以及6 4和...