大概花了一周的時間把八大基礎排序過了一遍,這篇博文主要是用來回顧一下八大基礎排序的要點和一些總結~
回顧:總的來說:快速排序是用得比較廣泛的乙個排序,也是經常出現的乙個排序,應該重點掌握~
思路:
**實現要點:
優化:如果一趟排序後也沒有交換位置,那麼該陣列已有序~
//外層迴圈是排序的趟數
for (int i = 0; i < arrays.length -1 ; i++)
}//如果比較完一趟沒有發生置換,那麼說明已經排好序了,不需要再執行下去了
if (ischange == 0)
}
思路:
**實現要點:
//外層迴圈控制需要排序的趟數思路:for (int i = 0; i < arrays.length - 1; i++)
}//交換
temp = arrays[pos];
arrays[pos] = arrays[arrays.length - 1 - i];
arrays[arrays.length - 1 - i] = temp;
}
**實現:
//臨時變數思路:int temp;
//外層迴圈控制需要排序的趟數(從1開始因為將第0位看成了有序資料)
for (int i = 1; i < arrays.length; i++)
//退出了迴圈說明找到了合適的位置了,將當前資料插入合適的位置中
arrays[i] = temp;
}
**實現:
遞迴l到支點前乙個元素(j)(執行相同的操作,同上)
遞迴支點後乙個元素(i)到r元素(執行相同的操作,同上)
/**思路:* 快速排序
* *@param arr
*@param l 指向陣列第乙個元素
*@param r 指向陣列最後乙個元素
*/public
static
void
quicksort(int arr, int l, int r)
}//上面乙個while保證了第一趟排序支點的左邊比支點小,支點的右邊比支點大了。
//「左邊」再做排序,直到左邊剩下乙個數(遞迴出口)
if (l < j)
quicksort(arr, l, j);
//「右邊」再做排序,直到右邊剩下乙個數(遞迴出口)
if (i < r)
quicksort(arr, i, r);
}
**實現:
public
static
void
main(string args) ;
mergesort(arrays, 0, arrays.length - 1);
}/**
* 歸併排序
**@param arrays
*@param l 指向陣列第乙個元素
*@param r 指向陣列最後乙個元素
*/public
static
void
mergesort(int arrays, int l, int r) else
}/**
* 合併陣列
**@param arrays
*@param l 指向陣列第乙個元素
*@param m 指向陣列分隔的元素
*@param r 指向陣列最後的元素
*/public
static
void
merge(int arrays, int l, int m, int r)
for (int i = m; i <= r; i++)
int i = 0, j = 0;
// arrays陣列的第乙個元素
int k = l;
//比較這兩個陣列的值,哪個小,就往陣列上放
while (i < leftarray.length && j < rightarray.length) else
}//如果左邊的陣列還沒比較完,右邊的數都已經完了,那麼將左邊的數抄到大陣列中(剩下的都是大數字)
while (i < leftarray.length)
//如果右邊的陣列還沒比較完,左邊的數都已經完了,那麼將右邊的數抄到大陣列中(剩下的都是大數字)
while (j < rightarray.length)
}
思路:
**實現:
public
static
void
main(string args) ;
for (int i = 0; i < arrays.length; i++)
}/**
* 完成一次建堆,最大值在堆的頂部(根節點)
*/public
static
void
maxheapify(int arrays, int size)
}/**
* 建堆
* *@param arrays 看作是完全二叉樹
*@param currentrootnode 當前父節點位置
*@param size 節點總數
*/public
static
void
heapify(int arrays, int currentrootnode, int size)
}if (right < size)
}//如果最大的不是根元素位置,那麼就交換
if (max != currentrootnode) }}
思路:
**思路:
/**
* 希爾排序
**@param arrays
*/public
static
void
shellsort(int arrays)
arrays[j] = temp;}}
}
思路:
**實現:
public
static
void
main(string args) ;
radixsort(arrays);
}public
static
void
radixsort(int arrays)
//**桶子裡的元素
int k = 0;
//有10個桶子
for (int j = 0; j < 10; j++) }}
}}
/*** 遞迴,找出陣列最大的值
**@param arrays 陣列
*@param l 左邊界,第乙個數
*@param r 右邊界,陣列的長度
*@return
*/public
static
intfindmax(int arrays, int l, int r) else else }}
對於排序的時間複雜度和穩定性網上的圖也很多很多,我就隨便找一張了(侵刪)
要是對某個排序不太理解的同學最好是到我寫的單個文章中進行查閱,因為有分解的步驟~
八大基礎排序總結
總的來說 快速排序是用得比較廣泛的乙個排序,也是經常出現的乙個排序,應該重點掌握 第一趟排序後已經將最大值放到陣列最後面了 接下來是排序 整體 的資料了 bubblesort arrays,l,r 1 前置知識 遞迴就這麼簡單 快速排序 param arr param l 指向陣列第乙個元素 par...
八大基礎排序總結
大概花了一周的時間把八大基礎排序過了一遍,這篇博文主要是用來回顧一下八大基礎排序的要點和一些總結 回顧 總的來說 快速排序是用得比較廣泛的乙個排序,也是經常出現的乙個排序,應該重點掌握 思路 實現要點 優化 如果一趟排序後也沒有交換位置,那麼該陣列已有序 外層迴圈是排序的趟數 for int i 0...
八大排序總結
排序方式 時間複雜度 最好 最壞情況 空間複雜度 穩定性 氣泡排序 o n 2 o n o 1 穩定 選擇排序 o n 2 o 1 不穩定 直接插入排序 o n 2 o n o 1 穩定 希爾排序 o n 1.3 o 1 不穩定 堆排序 o nlog 2 n o 1 不穩定 歸併排序 o nlog ...