咋們今天來聊一聊比較常見的排序,選擇,冒泡,計數,插入
選擇排序
核心思想:當前元素和之後所有元素進行比較,如果當前大於後者,則進行交換
咋們來一個動圖,就可以更加直觀的瞭解了
算法步驟 :
1.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
2.再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。
3.重複第二步,直到所有元素均排序完畢。
代碼演示:
class 排序{
public static void mian(String[] args){
int[] S=new int[10];
for(int i=0;i<S.length-1;i++){
for(int j=i+1;j<S.length;j++){
if(S[i]>S[j]){
int temp = S[i];
S[i]=S[j];
S[j]=temp;
}
}
}
show(S);
}
public static void show(int[] S){
String s="[";
for(int i=0;i<S.length;i++){
if(i==S.length-1){
s+=S[i]+"]";
}else{
s+=S[i]+",";
}
}
System.out.println(s);
}
}
冒泡排序
對於冒泡排序,我想大家想必不陌生,他是兩兩進行比較,大的一直往下沉(這裏默認的情況是從小到大)
圖解
算法 步驟:
1.比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。
3.針對所有的元素重複以上的步驟,除了最後一個。
4.持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
代碼演示
class 冒泡{
public static void main(String[] args){
bubbleSort();
}
public static void bubbleSort(){
int[] arr={8,5,9,2,7,4,6,1,3};
for(int i=0;i<arr.length-1;i++){//-1是少一輪比較
for(int j=0;j<arr.length-1-i;j++){//-1避免重複比較和角標越界
if(arr[j]>arr[j+1]){
swap(arr,j,j+1);
}
}
}
show(arr);
}
public static void show(int[] arr){
//[1,2,3,4,5,6,7,8,9]
String s="[";
for(int i=0;i<arr.length;i++){
if(i==arr.length-1){
s+=arr[i]+"]";
}else{
s+=arr[i]+",";
}
}
System.out.println(s);
}
}
注意選擇排序與冒泡排序的區別:冒泡排序通過依次交換相鄰兩個順序不合法的元素位置,從而將當前最小(大)元素放到合適的位置;而選擇排序每遍歷一次都記住了當前最小(大)元素的位置,最後僅需一次交換操作即可將其放到合適的位置。
插入排序
通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。
算法步驟:
1.將第一待排序序列第一個元素看做一個有序序列,把第二個元素到最後一個元素當成是未排序序列。
2.從頭到尾依次掃描未排序序列,將掃描到的每個元素插入有序序列的適當位置。(如果待插入的元素與有序序列中的某個元素相等,則將待插入元素插入到相等元素的後面。)
代碼演示:
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[] array={12,73,45,69,35};
int i,j,temp;
for(i=1;i<array.length;i++) {
/*
* 第一個for循環
* 把數組分成兩部分,右邊爲未排序,左邊爲已排序
* 記錄排序與未排序分割點temp(temp爲下一個排序對象)
*/
temp=array[i];
for(j=i-1;j>=0;j--) {
/*
* 第二個for循環
* 將排序對象temp與已排序數組比較
* 當temp比最近左邊的數大時(按從小到大循序排列時)
* 直接結束本次循環,進行下一個數排序
* 否則比左邊這個數小時將這個數後移,騰出這個數的位置
*/
if (temp > array[j]) {
break;
}else{
array[j+1] = array[j];
}
}
array[j+1]=temp;
}
System.out.println(Arrays.toString(array));
}
}
計數排序
先找出最大值最小值,之後統計每個數出現的次數,根據次數從小到大往數組裏添加。它適用於當前數組密集的情況。
計數排序不是基於比較的排序算法,其核心在於將輸入的數據值轉化爲鍵存儲在額外開闢的數組空間中。 作爲一種線性時間複雜度的排序,計數排序要求輸入的數據必須是有確定範圍的整數。
算法步驟:
1.找出待排序的數組中最大和最小的元素;
2.統計數組中每個值爲i的元素出現的次數,存入數組C的第i項;
3.對所有的計數累加(從C中的第一個元素開始,每一項和前一項相加);
4.反向填充目標數組:將每個元素i放在新數組的第C(i)項,每放一個元素就將C(i)減去1.
代碼演練
//計數排序
public static void CountSort(int *a, int size){
int max = a[0];
int min = a[0];
for (int i = 0; i < size; ++i)
{
if (a[i] > max)
max = a[i];
if (a[i] < min)
min = a[i];
}
int range = max - min + 1; //要開闢的數組範圍
int *count = new int[range];
memset(count, 0, sizeof(int) * range); //初始化爲0
//統計每個數出現的次數
for (int i = 0; i < size; ++i) //從原數組中取數,原數組個數爲size
{
count[a[i] - min]++;
}
//寫回到原數組
int index = 0;
for (int i = 0; i < range; ++i) //從開闢的數組中讀取,開闢的數組大小爲range
{
while (count[i]--)
{
a[index++] = i + min;
}
}
delete[] count;
}
排序還有好多,另外再見