一、基本概念:
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...