排序
歸併排序:
不交換資料,但需要借助額外的空間,用作臨時的儲存空間。
快速排序、希爾排序、直接選擇排序、堆排序是不穩定的排序演算法,而基數排序、氣泡排序、直接插入排序、折半插入排序、歸併排序、基數排序是穩定的排序演算法。
演算法的時間複雜度
注意:時間複雜度並不是指演算法執行所需要的時間,而是演算法執行的次數。
氣泡排序:o(n),o(n^2)
插入排序:o(n),o(n^2)
選擇排序:o(n^2)
快速排序:o(nlog2n)
堆排序:o(nlog2n)
歸併排序:o(nlog2n)
演算法實現如下(c語言):
#include #include #include #define swap(a,b) // 巨集定義swap
// 氣泡排序
void bubble_sort(int* arr,int len) // 傳入需要排序的陣列及其長度
} if(flag) break; // 因為發生交換,所以還沒有排好序 }}
// 插入排序
void insert_sort(int* arr,int len)
} if(index != -1)
arr[index] = t; // 將臨時變數插入到最遠位置 }}
// 選擇排序
void select_sort(int* arr,int len)
swap(arr[i],arr[max]); // 當前值和最大值進行交換 }}
void _quick_sort(int* arr,size_t left,size_t right)
while(pi < r && arr[r] >= pv) r--; //
if(pi < r) // 如果沒有超出範圍,說明找到比標桿小的值
arr[pi] = pv; // 還原標桿的值
if(pi-left > 1) _quick_sort(arr,left,pi-1); // 遞迴
if(right-pi > 1) _quick_sort(arr,pi+1,right); }}
// 快速排序
void quick_sort(int* arr,size_t len)
void create_heap(int* arr,size_t root,size_t len)
if(right < len)
if(max != root) // 如果被修改過
swap(arr[max],arr[root]); // 交換當前根與最大值
}// 堆排序
void heap_sort(int* arr,size_t len)
void merge_sort(int* arr,size_t len)
void show_arr(int* arr,size_t len)
{ for(int i=0; i碼雲:傳送門
演算法學習筆記 排序之選擇排序
選擇排序需要額外的儲存空間,且排序的時間為o n 2 其實為o 1 2 n 2 但是常數可以省略。選擇排序每次都遍歷一遍剩下的數,然後選出最小的乙個數放到排序好的儲存空間中去。python中沒有陣列,所以用列表 list 代替。def find smallest array smallest arr...
Java學習筆記之陣列排序演算法
寫在前面 程式設計的本質就是對資料 資訊以資料的形式而存在 的處理,實際程式設計中不得不處理大量資料,因此實際動手程式設計之前必須先分析處理這些資料,處理資料之間存在的關係。資料元素之間存在的關聯關係被稱為資料的邏輯結構。邏輯結構大致可分為4種 1 集合 資料元素之間只有 同屬乙個集合 的關係。2 ...
演算法導論之快速排序 學習筆記
或者你也可以打個比喻,想象一下,假設r為主元素,j元素為前方開路元素,和主元素進行比較,如果大於主元素則繼續開路 如果小於主元素則i元素加1之後和j元素交換之後,j元素繼續開路直到最後。書中給出了劃分的偽 1 partition a,p,r 2 x a r 將最後乙個元素作為主元素 3 i p 1 ...