菜鳥的演算法日常

2021-07-09 04:36:16 字數 1365 閱讀 1227

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...