演算法筆記 歸併排序 快速排序 計數排序

2022-07-06 13:15:14 字數 2532 閱讀 5594

public static void mergesort(int a) 

public static void mergesort(int a, int start, int end)

// 取中點

int mid = start + (end - start) / 2;

// 遞迴排序左半部分

mergesort(a, start, mid);

// 遞迴排序右半部分

mergesort(a, mid + 1, end);

// 執行到這裡時 [start, mid] [mid + 1, end]已經各自有序 將兩個有序陣列合併為乙個

merge(a, start, mid, end);

}public static void merge(int a, int start, int mid, int end) else

}while (i <= mid)

while (j <= end)

k = 0; i = start;

while (i <= end)

}

public static void quicksort(int a) 

public static void quicksort(int a, int start, int end)

// 分割槽方法:將陣列分為三個部分 前半部分的所有數均小於a[pivot] 後半部分的數均大於a[pivot]

int pivot = partition(a, start, end);

// 遞迴排序前半部分

quicksort(a, start, pivot - 1);

// 遞迴排序後半部分

quicksort(a, pivot + 1, end);

}public static int partition(int a, int start, int end)

}// 將最後乙個數放到分割的位置上

swap(a, i, end);

// 返回其索引

return i;

}public static void swap(int a, int i, int j)

// 快速選擇 找到無序陣列中第k大的數

public static int findkthlargest(int a, int k)

public static int quickselect(int a, int start, int end, int k)

int pivot = partition(a, start, end);

if (pivot == k) else if (pivot > k) else

}public static int partition(int a, int start, int end)

}swap(a, i, end);

return i;

}

/**

* 要求陣列中的元素為非負數 且範圍不能太大

*/public static void countingsort(int a)

}// 計算每個元素的個數

int count = new int[max + 1];

for (int num : a)

// 累加個數 count[i]中的值為 <=i的數個數

for (int i = 1; i <= max; i++)

int temp = new int[len];

// 從後向前遍歷 將元素插入到相應位置

for (int i = len - 1; i >= 0; i--)

system.arraycopy(temp, 0, a, 0, len);

}/**

* 假設我們現在需要對 d,a,f,b,c,a,z 這個字串進行排序,

* 要求將其中所有小寫字母都排在大寫字母的前面,

* 但小寫字母內部和大寫字母內部不要求有序。

* 比如經過排序之後為 a,c,z,d,f,b,a,這個如何來實現呢?

* 如果字串中儲存的不僅有大小寫字母,還有數字。

* 要將小寫字母的放到前面,大寫字母放在最後,數字放在中間,

* 不用排序演算法,又該怎麼解決呢?

*/public static void sortchar(char c)

while (!character.islowercase(c[j]))

if (i >= j)

swap(c, i, j);

i++;

j--;

}j = c.length - 1;

while (i < j)

while (character.isuppercase(c[j]))

if (i >= j)

swap(c, i, j);

i++;

j--;

}}public static void swap(char c, int i, int j)

排序演算法 歸併排序 計數排序

1.歸併排序 將待排序序列分成兩個長度相同的子串行,對每個子串行進行排序,直至子串行剩餘乙個數,在將其合併成乙個序列 具體步驟 分組 將待排序序列一分為2,在將子串行進行劃分,直至子串行只有乙個元素 歸併 將每個子串行進行排序,將排好序的兩個子串行進行合併 演算法分析 void merge data...

JS演算法3 排序 歸併排序 快速排序

歸併排序 1.左右兩邊先排序 2.再借助輔助陣列,指標在左右兩個陣列中移動,兩指標作比較,小的就往輔助陣列中填 3.整體在輔助陣列中有序後,拷貝回原陣列。歸併排序 時間複雜度o n logn var list 5 2,6 1,22 77,4 12 console.log 未排序 list funct...

演算法之常見排序演算法 氣泡排序 歸併排序 快速排序

引言 對於程式設計中琳琅滿目的演算法,本人向來是不善此道也不精於此的,而說起排序演算法,也只是會氣泡排序。還記得當初剛做開發工作面試第一家公司時,面試官便讓手寫氣泡排序 入職之後才知道,這面試官就是乙個氣泡排序 病態 愛好者,逢面試必考氣泡排序 後來看吳軍的一些文章,提到提高效率的關鍵就是少做事情不...