排序演算法(一)

2021-09-12 01:20:30 字數 1430 閱讀 5002

一、基本概念:

1.排序演算法是一種很重要的演算法,許多其他演算法是以排序演算法為基礎的。排序演算法主要有氣泡排序、插入排序、希爾排序、選擇排序、堆排序、歸併排序、快速排序。

2.內部排序:在記憶體空間裡完成資料的排序,一次完成

3.排序的穩定性:如果兩個大小相等的元素在排序後相對位置不變,則排序是穩定的

4.沒有一種排序在任意情況下都是最好的,需要分情況使用

二、演算法實現:

1.氣泡排序:大泡泡不斷往上

(1)優化:設定乙個tag,如果某一次排列都沒有執行,則退出迴圈

(2)適用於鍊錶

(3)只交換嚴格滿足大於的元素,演算法穩定

(4)時間複雜度:o(n2)

(5)演算法實現(c++):

void bubble_sort(int a, int n)

} }}

(6)演算法優化:

void bbubble_sort(int a, int n)

} if (flag == 0) //如果有任何一次沒有發生交換,則退出迴圈

break;

}}

2.插入排序:類似於打撲克牌抓牌

(1)每次抓一張牌,與前一張牌比較,比前一張小的話則把前一張牌向後移動,否則插入

(2)在序列基本有序的情況下,插入排序簡單高效

(3)時間複雜度:o(n2)

(4)演算法實現(c++):

void insertion_sort(int a, int n)

}

3.希爾排序:對插入排序的優化,預先使序列有序一點

(1)設定乙個增量序列,對每個增量序列進行插入排序

(2)時間複雜度:選取不同的增量序列時間複雜度不同,通常為o(n1.5)

(3)演算法實現(增量序列n/2):

void shell_sort(int a, int n)

}}

4.選擇排序:每次從無序序列中選擇最小的元素放入有序序列的末尾

(1)時間複雜度:o(n2)

(2)每執行一次,都把最小元素放到序列最前面

(3)演算法實現:

void selection_sort(int a, int n)

}

三、舉個栗子(leetcode973.最接近原點的k個點)

(1)首先採用插入排序演算法,但是執行超過了時間限制

(2)考慮使用選擇排序,只需進行k次即可

vector> kclosest(vector>& points, int k) 

void selection_sort(vector>& v,int k)

}if (min_t != i)

}

(3)可以用堆排序進行優化

排序演算法(一)

這個學期課程很少,空閒時間很多,故重新複習了一下 演算法導論 中的常用演算法和資料結構,並且將實現 儲存到部落格,以便大三暑假找實習時方便複習。直接插入排序的思想非常簡單,將序列中第乙個元素作為乙個有序序列,然後將剩下的n 1個元素按關鍵字大小依此插入該有序序列,每插入乙個元素後依然保持該序列有序,...

排序演算法一

3個簡單的排序演算法,不多解釋了,直接上 include include void display int a,int n printf n void exchange int a,int i,int j 氣泡排序 void popsort int a,int n end for j printf ...

排序演算法(一)

氣泡排序 基本思想 在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉 較小的往上冒。即 每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。氣泡排序的示例 演算法實現 void print int arr,int size...