資料結構研究之五 高階排序

2021-08-15 12:06:05 字數 3527 閱讀 3124

1.歸併排序

a.步驟提要:將原有陣列分割平分成兩個陣列,然後分別排序。將排好序的區域性陣列整合成乙個陣列,然後遞迴執行此過程 

b.過程:

//

// created by 葉子 on 2018/1/27.

// 歸併排序

//#include "iostream"

using namespace std;

#define max 500000

#define sentinel 20000000;

int l[max/2+2],r[max/2+2];

int cnt;

void merge(int a,int n,int left,int mid,int right) else

}}void mergesort(int a, int n, int left, int right)

}int main()

cout << endl;

cout << cnt <#define max 100000

int a[max],n;

int partition(int p,int r)

}t = a[i+1];a[i+1]= a[r];a[r] = t;

return i+1;

}int main()

printf("\n");

return 0;

}

3.快速排序:

a.題目:將指定的撲克在考慮花色和點數的情況下按公升序排列,另外判斷這些輸入的數字和輸出的順序是否一致

b.步驟:

1)以陣列的最末尾的值為標準值「分割」陣列

2)將分割好的陣列執行快速排序

3)合併,然後遞迴執行這三步

c.注意點:要提高效率,可以在每次分割時以需要分割的陣列的「中間值」為標準值

d.**:

//

// created by 葉子 on 2018/1/27.

// 快速排序與歸併排序的比較

//#include #define max 100000

#define sentinel 2000000000

struct card ;

struct card l[max / 2 + 2],r[max / 2 + 2];

void merge(struct card a,int n ,int left,int mid,int right)else

}}void mergesort(struct card a,int n ,int left,int right)

}int partition(struct card a,int n ,int p ,int r)

}t = a[i+1];a[i+1] = a[r];a[r] = t;

return i+1;

}void quicksort(struct card a,int n,int p ,int r)

}int main()

mergesort(a,n,0,n);

quicksort(b,n,0,n-1);

for ( i = 0 ; i < n ; i ++)

if ( stable == 1) printf("stable\n");

else printf("not stable\n");

for ( i = 0 ; i < n ; i ++)

return 0;

}

4.計數排序:

b.詳述:對於輸入陣列a的各元素a(j)進行排序時,將小於等於a(j)的元素數記錄在計數陣列c中,然後根據c中的數值計算a(j)在輸出陣列b中的位置。考慮到存在多個相等元素的情況,我們還需要在輸出元素a(j)【加入b】之後修正計數用的c(a(j))

c.注意:其執行所需要的時間及記憶體空間也與a(j)的最大值成正比

d.**:

//

// created by 葉子 on 2018/1/28.

// 計數排序

#include "stdio.h"

#include "stdlib.h"

#define max 200001

#define vmax 10000

int main()

for ( i = 1 ; i <= vmax ; i ++) c[i] = c[i] + c[i-1];

for ( j = 1 ; j <= n ; j ++)

for ( i = 1 ; i <=n ; i ++)

printf("\n");

return 0;

}

5.使用標準庫排序:

a.定義:使用標準庫里的sort

b.**:

//

// created by 葉子 on 2018/1/28.

// 用c++內建函式排序

//#include "iostream"

#include "vector"

#include "algorithm"

using namespace std;

int main()

sort(v.begin(),v.end());

for ( int i = 0 ; i < v.size() ; i ++)

cout << endl;

return 0;

}

6.最小成本排序:

a.題目:求給指定的陣列進行排序的最小交換次數

b.解析:需要考慮「借整體最小元素」與「不借整體最小元素」兩種情況

c.**:

//

// created by 葉子 on 2018/1/28.

// 最小成本統計

//#include "iostream"

#include "algorithm"

using namespace std;

static const int max = 1000;

static const int vmax = 10000;

int n,a[max],s;

int b[max],t[vmax + 1];

int solve()

sort(b,b+n);

for ( int i = 0 ; i < n ; i ++) t[b[i]] = i ;

for ( int i = 0 ; i < n ; i ++)

ans += min(s+(an-2) * m,m+s+(an+1)*s);

}return ans;

}int main()

int ans = solve();

cout << ans << endl;

return 0;

}

資料結構之排序演算法(五

索引堆 function swap arr,x,y 索引堆 儲存結構為兩個陣列 第乙個陣列 為索引 第二個陣列為 值 每次取最大值的時候,只改變索引結構 而值不變 這樣保證了資料的一致性 class maxheap 返回 資料的大小 size 判斷item是否是 空的 isempty 新增新元素 i...

資料結構學習之 排序高階(堆排序)

氣泡排序 一種比較容易理解的排序演算法,可以優化的程度也比較有限 平均 o n 2 最壞 o n 2 最好 o n 最好情況需要在進行迴圈之前加入標誌位,若一次遍歷中,沒有任何兩個資料被交換,則認為序列已經有序,跳出迴圈。此時,時間複雜度為o n 插入排序 選擇乙個資料插入到前面已經排好的有序佇列之...

資料結構和演算法之排序五 選擇排序

所以說呀這就是強盜行為,遇到自己想的就拿過來,還有比這更強盜的麼。上 表示敬意 public static void selectsort int arr 我們可以看見我們控制次數的時候進行了 1的操作,這時因為你都保證前邊所有的資料都通過排序處理好了,那麼最後乙個可不就是無冕之王,待著最後了唄。裡...