排序演算法
描述
時間複雜度
空間複雜度
穩定性
說明
氣泡排序
正反迴圈
o(n*n)
o(1)是
插入排序
慢慢有序
o(n*n)
o(1)是
歸併排序
分治o(n*logmn)
o(n)是
基數排序
求餘o(n*logmn)
o(11n)
是lsd msd
選擇排序
選擇min or max
o(n*n)
o(1)否
快速排序
分治(直接兩邊大小區分)
o(n*log2n)
o(1)否
希爾排序
三重迴圈
o(n*log2n)
o(1)
否有序的序列效率很高
堆排序構造堆頂,交換
o(n*log2n)
o(1)
否均效能較接近於最壞效能
public class sort
public static void print(int data)
system.out.println();
} /**
* 氣泡排序
* (穩定)
* 每次通過交換,將最大或者最小的移動到前面
*/public static void bubblesort(int data)
}} }
/*** 插入排序
* (穩定)
* 處理順序是:1個元素有序,2個元素有序,3個元素有序。。。。
*/public static void insertsort(int data)
}} }
/*** 歸併排序 (2路歸併)
* (穩定)
* 要點:
* 1. int mid = (last+first)/2;
* 2. i < last+1
*/public static void mergesort(int data, int first, int last)
int mid = (last+first)/2;
mergesort(data, first, mid);
mergesort(data, mid + 1, last);
merge(data, first, mid, last);
} public static void merge(int data, int first, int mid, int last)else
k++;
} while (begin1 <= end1)
while (begin2 <= end2)
for (int i = first; i < last+1; i++) }
/*** 基數排序
* (穩定)
* 要點:
* 1. temp空間的開闢
* 2. 計數空間的開闢
* 3. 如何通過radix求取remainder
*/public static void radixsort(int data,int depth)
for (int i = 0; i < data.length; i++)
temp[remainder][count[remainder]] = data[i];
count[remainder]++;
}int k = 0;
for (int i = 0; i < temp.length; i++)
}radix = radix*10;
} }/**
* 選擇排序
* (不穩定)
* 每次找到最大(或者最小的),放到前面
*/public static void selectsort(int data)
}swap(data, min, i);
} }/**
* 快速排序(改進的氣泡排序)
* (不穩定)
* 迴圈遞迴
* 要點:
* 1. 巢狀的while迴圈條件 ileft
* 2. 將key元素交換到正確的位置(和j所在元素交換)
*/public static void quicksort(int data, int left, int right)
int key = data[left];
int i = left + 1;
int j = right;
while(true)
while (data[i] < key && i < right) i++ ;
if (i < j)
if (i >= j)
} swap(data, left, j);
quicksort(data,left,j-1);
quicksort(data,j+1,right); }
/*** 希爾排序(改進的插入排序)
* (不穩定)
* 三重迴圈
*/public static void shellsort(int data) }}
}datalength = datalength/2;
} }/**
* 堆排序
* (不穩定)
* 從小到大,就構造大頂堆。
* 要點:
* 1. 半次迴圈,將最大的數字弄到堆頂。
* 2. 構造堆的長度不斷減小。
*/public static void heapadjust(int data, int i, int length)
if (data[parent] < data[child]) else
} }public static void heapsort(int data, int length)
for (int i = length - 1; i >= 1 ; i--) }
public static void main(string args) , ,,
, };
for (int i = 0; i < datas.length; i++)
}}
memset 的效率以及原始碼分析
void memset void s,int ch,size t n 作用 將s所指向的某一塊記憶體中的每個位元組的內容全部設定為ch指定的ascii值,塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作。不知道有沒有像我一樣把memset當作萬能的初始化工具,例如 int arr ...
memset 的效率以及原始碼分析
void memset void s,int ch,size t n 作用 將s所指向的某一塊記憶體中的每個位元組的內容全部設定為ch指定的ascii值,塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作。不知道有沒有像我一樣把memset當作萬能的初始化工具,例如 int arr ...
MySQL原始碼分析以及目錄結構
主要模組及資料流 經過多年的發展,mysql的主要模組已經穩定,基本不會有大的修改。本文將對mysql的整體架構及重要目錄進行講述。原始碼結構 mysql 5.5.0 m2 主要資料結構 主要呼叫流程 mysql啟動 主要 在sql mysqld.cc中,精簡後的 如下 int main int a...