1、快速排序
方法:選擇陣列中的乙個數,將陣列中比它小的數放在它的左邊,陣列中比它大的數放在它的右邊,然後遞迴(而這樣的方法有很多,這裡僅是總體思想)
舉個栗子:挖坑填坑法(這名字絕逼不是我取的)
先上**:
int a[10];
void sort_(int m,int n)
if(m>=n) return;
//遞迴條件。注意這裡的
>=
是因為若所取的數為
a[m]
時,遞迴則會去取m到
m-1為範圍
int i=m, j=n,t;
t = a[i];
while (i != j)
for (;a[j] > t&&j>i;j--);
a[i] = a[j];
if(i!=j)
for (;a[i] <= t&&ia[j] = a[i];
a[i] = t;
sort_(m, i-1);
//遞迴的取值範圍必須是所取數的下標
+1/-1
到最大/
最小,否則會死迴圈
sort_(i+1, n);
}//本快排由律爺特約修改播出
2、歸併排序
方法:(其實是分治法的具體體現)先將陣列近乎平等地分成兩份,兩份各自分別排序,再將左右兩陣列的元素從第乙個開始比較,小的則取出存進新陣列,大的繼續和另乙個陣列的下乙個元素比較,最後將新陣列複製到原陣列,遞迴完成。
直接上**:
int a[10],t[10];//在自定義函式裡的定義陣列容易出現未知錯誤,所以盡量開全域性陣列
void merge_sort(int
a, int
x,int
y,int
t)if (y - x > 1)
int m = x + (y - x) / 2;
//相比與(x+y)/2,這裡的優勢在於向0取整,即正數時兩式相同,負數時(x+y)/2會向小 的一方取整
int p = x, q = m, i = x;
merge_sort(a, x, m, t);
merge_sort(a, m, y, t);
while (p < m || q < y)
if (q >= y || (p < m&&a[p] <= a[q]))
//後面乙個條件不可省略其中的pt[i++] = a[p++];
else
//((qa[q]) || p>=m)
t[i++] = a[q++];
for (i = x;i < y;i++)
a[i] = t[i];
//至於兩種演算法對於相同陣列元素的排序的影響應該不大,沒二分查詢那麼麻煩
菜鳥的日常積累 Linux
gfortran a.f90 b.f90 o test 兩個原始碼檔案a,b可被編譯鏈結成乙個名為 test 的可執行程式gfortran c a.f90 o a.o gfortran c b.f90 o b.o gfortran a.o b.o o test 先將每乙個原始碼檔案編譯成物件檔案,而...
演算法 日常更新
1.成績排序 題目 輸入任意 使用者,成績 序列,可以獲得成績從高到低或從低到高的排列,相同成績都按先錄入排列在前的規則處理。輸入描述 輸入多行,先輸入要排序的人的個數,然後輸入排序方法0 降序 或者1 公升序 再分別輸入他們的名字和成績,以乙個空格隔開。輸出描述 按照指定方式輸出名字和成績,名字和...
菜鳥練演算法
領扣演算法練習 每日一道 題目描述 給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例 1 輸入 2,3,1,1,4 輸出 true 解釋 我們可以先跳 1 步,從位置 0 到達 位置 1,然後再從位置 1 跳 3...