演算法之排序 學習筆記

2021-09-25 11:18:11 字數 1506 閱讀 6662

排序

歸併排序

不交換資料,但需要借助額外的空間,用作臨時的儲存空間。

快速排序、希爾排序、直接選擇排序、堆排序是不穩定的排序演算法,而基數排序、氣泡排序、直接插入排序、折半插入排序、歸併排序、基數排序是穩定的排序演算法。

演算法的時間複雜度

注意:時間複雜度並不是指演算法執行所需要的時間,而是演算法執行的次數。

氣泡排序: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 ...