排序演算法分析以及原始碼

2021-08-31 04:37:11 字數 3381 閱讀 6603

排序演算法

描述

時間複雜度

空間複雜度

穩定性

說明

氣泡排序

正反迴圈

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