今天我們來總結一下資料結構中各種排序演算法。
資料結構排序演算法 part1:
直接插入排序:
思想:當插入第i(i>=1)個元素時,前面的array[0],array[1],…,array[i-1]已經排好
序,此時用array[i]的排序碼與array[i-1],array[i-2],…的排序碼順序進行比較,找到插入
位置將array[i]插入,原來位置上的元素順序後移。
簡單來說:end指已經排好陣列的最後乙個元素,end找到插入的位置(設定乙個temp,temp為已經排序好陣列的下乙個元素),用temp與end比較,如果temp=0 && array[end]>temp)
array[end+1] = temp;
}}二分查詢直接插入排序:
思想:在插入排序的基礎上加入二分查詢的思想,減少查詢次數
時間複雜度:o(log(n))
空間複雜度:o(1)
穩定性:穩定的(同插入查詢)
**實現:
//二分查詢插入排序
void insert_sort_p(int array, int size)
//這裡有等於 等於的話相同的插入到後面
else
}//這裡比left的原因是因為right-1可能最後為負數
while (end>=0&&end >= left)
//如果要是上面while沒有執行 則此時temp還是end+1的值 這一步相當於沒有做
array[end + 1] = temp;
}}
希爾排序:思想:先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄「基本有序」時,再對全體記錄進行依次直接插入排序。
時間複雜度:o(n^1.25) ---o(1.6n^1.25)
空間複雜度:o(1)
穩定性:不穩定
**實現:
//希爾排序
void shell_sort(int array,int size)
array[end+gap] = temp;
} gap--;
}}
選擇排序:思想:每一趟(例如第i趟,i=0,1,…,n-2)在後面n-i個待排序的資料元素集合中選出關鍵
碼最小的資料元素,作為有序元素序列的第i個元素。待到第n-2趟做完,待排序元素集合中只剩下1個元素,排序結束。
時間複雜度:o(n*n)
空間複雜度:o(1)
穩定性:不穩定
**實現:
//選擇排序
void select_sort(int array, int size)
if (min != idx)}}
選擇排序的優化:思想:一次選出乙個最大的乙個最小的,陣列從兩方縮排遞減,把大的放到後面,小的放到前面。這時只用進行一半的次數,就可以對一組數排序完。
**實現:
//選擇排序優化
void select_sort_cool(int array,int size)
if (min != left)
if (max != right)}}
堆排序:思想:利用大小堆對資料進行排序。建堆排序,每次排序後陣列減一,把已經排好的元素剔除在外。
時間複雜度:o(nlogn)
空間複雜度:o(1)
穩定性:不穩定
**實現:
//建堆 //根由上到下換
void adjust_down(int array,int root, int size)
if (array[parent] < array[child])
else
break; }}
//堆排序
void heap_sort(int array,int size)
int index = size - 1;
while (index>0)
}
氣泡排序&&快速排序&&鴿巢排序:
歸併排序&&基數排序&&桶排序:
資料結構與演算法 選擇排序,插入排序
選擇排序 原理 每次選擇最大的或最小的乙個放在最前面後最後面 時間複雜度 o n 2 空間複雜度 o 1 不穩定排序 選擇排序 public static void selectsort int list int temp list minindex list minindex list i lis...
資料結構之基礎排序(選擇排序 插入排序 氣泡排序)
排序在 中用的非常普遍,所以今天我們來學下最基礎的三種排序,如果你已經爛熟於心,請跳過本文。注 我的 一般沒有注釋,我覺得沒啥必要,都是基礎挺簡單的。include include void print int array,int len printf n void swap int array,i...
資料結構和演算法 1 選擇排序 插入排序
一 選擇排序 author eric 從最左邊下標開始,將該下標的元素和它右邊所有元素比較,每一趟遍歷找出最小元素的下標 然後將最小下標的元素和每一趟遍歷開始的最左邊下標的元素互換,即每一趟遍歷都將最小值放在開始遍歷的最左的下標位置 public class selectionsort public...