1.1 演算法描述
初始狀態:無序區為r[1..n]
,有序區為空;
每一輪從無序區起點開始,相鄰元素兩兩比較,如果前面的比後面的元素大就交換,直到無序區最後。
針對所有的元素重複以上的步驟,每一輪冒泡操作無序區域元素減一,有序區元素減一;
重複執行n-1
輪,序列變為有序。
1.2 **演示
1.3 **實現
#include const int maxn=1e4+5,inf=2147483647;
int a[maxn];
int n;
void read()
void print()
void bubble_sort(int a)
}void solve()
int main()
2.1 演算法描述
2.2 **演示
2.3 **實現
#include const int maxn=1e4+5,inf=2147483647;
int a[maxn];
int n;
void read()
void print()
void select_sort(int a)
}void solve()
int main()
3.1 演算法描述
從第乙個元素開始,該元素可以認為已經被排序;
取出下乙個元素,在已經排序的元素序列中從後向前掃瞄;
如果該元素(已排序)大於新元素,將該元素移到下一位置;
重複步驟3
,直到找到已排序的元素小於或者等於新元素的位置;
將新元素插入到該位置後;
重複步驟2~5
。
3.2 **演示
3.3 **實現
#include const int maxn=1e4+5,inf=2147483647;
int a[maxn];
int n;
void read()
void print()
void insert_sort(int a)
}void solve()
int main()
4.1 演算法描述
選擇乙個較大的增量,一般選gap=n/2
,把下標為i,i+gap,i+2*gap+...+i+n/gap*gap
分為一組,對同組的元素進行插入排序。
減小增量為上乙個增量的一半,繼續操作1
。
重複以上操作,直到增量為1
,此時序列變為有序。
4.2 **演示
4.3 **演示
#include const int maxn=1e4+5,inf=2147483647;
int a[maxn];
int n;
void read()
void print()
void shell_sort()
void print()
void merge(int l,int mid,int r);//b儲存合併的序列
while(i<=mid && j<=r)//跳出迴圈兩個序列中有乙個為空
while(i<=mid)//若比較完之後,第乙個有序區仍有剩餘
b[++k]=a[i++];
while(j<=r)//若比較完之後,第二個有序區仍有剩餘
b[++k]=a[j++];
for(i=l,k=1;i<=r;++i,++k)//把合併後的排好序的序列拷貝到陣列a[l,r]
a[i]=b[k];
}void merge_sort(int l,int r)
void print()
void quick_sort(int l,int r)//交換函式
int heap[maxn],siz=0;
void push(int x)
void pop()
void print()
void counting_sort()
int cnt=0;
for(int i=min;i<=max;++i)
while(b[i])a[++cnt]=i,b[i]--;
}void solve()
int main()
9.1 演算法描述
設定乙個定量的陣列當作空桶子。
尋訪序列,並且把專案乙個乙個放到對應的桶子去。
對每個不是空的桶子進行排序。
從不是空的桶子裡把專案再放回原來的序列中。
9.2 **演示
9.3 時間效率10.1 演算法描述
取得陣列中的最大數,並取得位數;
arr
為原始陣列,從最低位開始取每個位組成radix
陣列;
對radix
進行計數排序(利用計數排序適用於小範圍數的特點);
10.2 **演示
**實現
#include const int maxn=1e4+5,inf=2147483647;
int a[maxn];
int n;
void read()
void print()
int get_max(int a,int n)
/* * 引數說明:
* a -- 陣列
* n -- 陣列長度
* exp -- 指數。對陣列a按照該指數進行排序。
* * 例如,對於陣列a=;
* (01) 當exp=1表示按照"個位"對陣列a進行排序
* (02) 當exp=10表示按照"十位"對陣列a進行排序
* (03) 當exp=100表示按照"百位"對陣列a進行排序
* ...
*/void count_sort(int a,int n,int exp);
// b儲存"被排序資料"的臨時陣列
for(int i=1;i<=n;++i)// 將資料出現的次數儲存在buckets中
buckets[(a[i]/exp)%10]++;
for(int i=1;i<10;++i)// 更改buckets[i]。目的是讓更改後的buckets[i]的值,是該資料在b中的位置。
buckets[i]+=buckets[i-1];
for(int i=n;i>0;--i)
for(int i=0;i<=n;++i)// 將排序好的資料賦值給a
a[i]=b[i];
}void radix_sort(int a,int n)
void solve()
int main()
十大排序演算法
1.非線性時間類排序 時間複雜度未突破 0 nlog 2n 不穩定的四個排序演算法 選擇排序 0 n2 希爾排序 0 n1.3 希爾排序實現python 快速排序 0 n log2 n 0 nlog 2n 0 nlog 2 n 快速排序實現c python 堆排序 0 n log2 n 0 nlog...
十大排序演算法
排序規則 從左至右依次增大 一 基於比較的排序演算法 插入排序 逐個遍歷未排序序列,將其在已排序序列中從右到左比較,直到遇到比自己小的數,然後將元素插入到那個數的後面,有序序列從左向右生長。選擇排序 在未排序序列中選擇最小的元素,將其插入到已排序序列的末尾,有序序列從左向右生長。氣泡排序 從左至右逐...
十大排序演算法
github 排序演算法是 資料結構與演算法 中最基本的演算法之一。排序演算法可以分為內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內部排序演算法有 插入排序 希爾排序 選擇排序 氣泡排序 歸併排序...