排序 思路簡析(一)

2021-07-08 09:21:48 字數 2627 閱讀 5668

本篇文章總結一下最近學習的排序演算法,提煉出其思想及不同之處。有歸併排序,快速排序,堆排序以及氣泡排序

採用兩兩分解和歸併的策略簡單易行,這樣的歸併排序稱為2-路歸併排序。

歸併排序的實現

public

static

void

sort(int arr)

public

static

void

mergesort(int arr, int first, int last, int temp)

}public

static

void

mergearray(int arr, int first, int mid, int last, int temp)

while (i <= mid)

temp[index++] = arr[i++];

while (j <= last)

temp[index++] = arr[j++];

for (int k = first; k <= last; k++)

}

另一種寫法:

// 將相鄰有序的a[i..m]和a[m+1..n] 歸併到b[i..n]  包含 n 

void merge(int a, int i,int m, int n, int b)else

}while(i<=m) b[k++] = a[i++];

while(j<=n) b[k++] = a[j++];

}// i:遞迴的層次(第一層為0)-- 用於指示在msort當前呼叫層次中a,b陣列的具體作用:

// 當i為奇數時,則從a[s..t]歸併至b[s..t]

// 否則從b[s..t]歸併至a[s..t]

void msort(int a, int b, int i,int s,int t)else

}void mergesort(int a,int len)

簡單分析:

整個歸併排序過程需要進行⌈l

ogn⌉

層的遞迴分解和歸併,由此得歸併排序的演算法時間複雜度為o(n*logn)

歸併排序是穩定排序

最簡單的交換排序是氣泡排序,而快速排序是對氣泡排序的改進。

首先從待排序列中選定乙個關鍵字,稱為樞軸,通過關鍵字與樞軸的比較將待排序的序列劃分為位於樞軸前後的兩個子串行,其中樞軸之前的子串行的所有關鍵字都不大於樞軸,樞軸之後的子串行都不小於樞軸,此時樞軸已經到位,再按同樣的方法對這兩個子串行分別遞迴進行快速排序,最終使得整個序列有序

快速排序的一次劃分具體過程:

private

static

void

qsort(int arr)

public

static

void

qsort(int arr, int first, int last) else

}public

static

intpartition(int arr, int first, int last)

arr[first] = key;

return first;

}

為避免樞軸關鍵字為最大或者最小的情況,可採用「三者取中」的方法,即以a[s]、a[t]、a[(s+t)/2]三者中關鍵字的大小居中的記錄為樞軸,並與a[s]互換

堆是一類完全二叉樹,若堆中所有非葉子結點均不大於其左右子節點,則稱為小頂堆;若堆中所有非葉子結點均不小於其左右子節點,則稱為大頂堆

堆的結構型別

typedef

struct heap;

int greatprior(int x,int y)

int lessprior(int x,int y)

int swapheapelem(heap &h,int i, int j)

// 堆的篩選操作,對堆中指定的pos結點為根的子樹進行堆的特性的維護,其前提是pos結點的左右子樹均滿足堆特性

void shiftdown(heap &h,int

pos)

}

int removefirsheap(heap &h, int &e)
void makeheap(heap &h,int a,int n,int

size,int tag,int (*prior)(int a,int b))

}

void heapsort(int a,int n)

}

void bubblesort(int a, int

len)}}

}

改進:

void bubblesort(int a, int

len)

for( j =1; j < len-i; j ++ )}}

}

其他學習鏈結氣泡排序的三種實現

ANR分析思路簡析

1.anr介紹 1.2 為什麼會產生anr 1 keydispatchtimeout 谷歌default 5s,mtk平台上是8s 主要型別 按鍵或觸控事件在特定時間內無響應 2 broadcasttimeout 10s broadcastreceiver在特定時間內無法處理完成 3 service...

Linux 系統故障排查思路簡析

處理linux系統故障的思路 1.重視錯誤提示資訊。2.查閱日誌檔案 message 系統日誌 服務的日誌 error 應用日誌 3.分析,定位問題。4.解決問題。忘記root密碼?重置 centos5或者6 啟動載入grub引導選單時 按esc 找到當前系統引導選項。按方向鍵找到需要的系統引導核心...

簡析HTTP協議(一)

首先說說協議 協議就是要通訊的雙方制定的,都需要用到的規定。比如南方人和北方人,各說各的家鄉話,雙方都聽不懂,無法交流,但如果他們約定好都說普通話,那交流就不成問題了。說普通話 就是這兩個人制定的協議。百科裡的說法 協議是用來描述程序之間資訊交換資料時的規則術語。其實就是網路上的各台計算機之間進行通...