氣泡排序是許多人最早接觸的排序演算法,由於邏輯簡單,所以大量的出現在計算機基礎課本上,作為一種最基本的排序演算法被大家所熟知。
無序陣列: 254
7168
3 遍歷1次後: 245
1673
8遍歷2次後: 241
5637
8...
遍歷7次後: 123
4567
8
void bubblesore(int *array, int n)}}
}
void bubblesore(int *array, int n) //優化
}i--;
}
}
如果讓乙個初學者寫乙個排序演算法,很有可能寫出的就是選擇排序(反正我當時就是 ^.^),因為選擇排序甚至比冒泡更容易理解。
無序陣列: 254
7168
3 遍歷1次後: 154
7268
3 遍歷2次後: 124
7568
3...
遍歷7次後: 123
4567
8
void selectsort(int *array, int n)
temp = array[min];
array[min] = array[i];
array[i] = temp;
}}#endif
打牌時(以挖坑為例)我們一張張的摸牌,將摸到的牌插入手牌的」順子」裡,湊成更長的順子,這就是插入排序的含義。
無序陣列: 2 | 547
1683
遍歷1次後: 2
5 | 471
683 遍歷2次後: 2
45 | 716
83 遍歷3次後: 245
7 | 168
3...
array[j+1] = temp;}}
}
我真的很敬佩設計出這個演算法的大神,連起名字都這麼霸氣——quick sort。為什麼這麼自信的叫快速排序?因為已經被數學家證明出 在交換類排序演算法中,快排是是速度最快的!
快排是c.r.a.hoare於2023年提出的一種劃分交換區的排序。它採用一種很重要的」分治法(divide-and-conquermethod)」的思想。快排是一種很有實用價值的排序方法,很多it公司在面試演算法時幾乎都會去問,所以快排是一定要掌握的。
陣列下標: 0 1 2 3 4 5 6 7
無序數列: 4 2 5 7 1 6 8 3
陣列下標: 0 1 2 3 4 5 6 7
無序數列: 3 2 5 7 1 6 8 5
陣列下標: 0 1 2 3 4 5 6 7
無序數列: 3 2 1 4 7 6 8 5
void quicksort(int *array, int l, int r)
if(i < j)
while(i < j && array[i] <= x)
if(i < j)
}array[i] = x;
quicksort(array, l, i - 1);
quicksort(array, i + 1, r);
}}
歸併排序是建立在歸併操作上的一種優秀的演算法,也是採用分治思想的典型例子。
我們知道將兩個有序數列進行合併,是很快的,時間複雜度只有-o(n)。而歸併就是採用這種操作,首先將有序數列一分二,二分四……直到每個區都只有乙個資料,可以看做有序序列。然後進行合併,每次合併都是有序序列在合併,所以效率比較高。
無序陣列: 254
7168
3 第一步拆分:254
7| 1 6 8 3
第二步拆分:2
5| 4 7 | 1 6 | 8 3
第三步拆分:2
| 5 | 4 | 7 | 1 | 6 | 8 | 3
第一步合併:2
5| 4 7 | 1 6 | 3 8
第二步合併:245
7| 1 3 6 8
第三步合併:123
4567
void mergesort(int *array, int n)
void mergesort(int *array, int first, int last, int *temp)
}void mergearray(int *array, int first, int
mid, int last, int *temp)
else
}while(i <= m)
while(j <= n)
memcpy(array + first, temp, sizeof(int) * k);
}
希爾排序的實質就是分組插入排序,該方法又稱為縮小增量排序,因dj.shell與2023年提出而得名。
無序陣列: 254
7168
3 第一次gap=8/2
2a 1a
5b 6b
4c8c7d3
d
一次增量: 154
3268
7 a b c
d a b c
d
一次增量: 154
3268
7第二次gap=4/2 :1a4
a2a8
a5b 3b 6b 7b
二次增量: 1 3 2 5 4 6 8 7
三次增量: 1 2 3 4 5 6 7 8
void shellsort(int *array, int n)
} }}
}
void shellsort(int *array, int n)
array[k+gap] = temp;
} }}
}
如果有這樣的數列,其中元素種類並不多,只是元素個數多,請選擇->計數排序。
比如一億個1~100的整型資料,它出現的資料只有100種可能。這個時候計數排序非常的快(親測,快排需要19秒,基數排序只需要不到1秒!)。
void count_sort(int *array, int
length, int
min, int
max)
for(i = 0, j = 0; i < c_size;)else
}free(count);
}
void minheapfixup(int a, int i)
a[i] = temp;
}
void minheapfixup(int a, int i)
void minheapaddnumber(int a, int n, int nnum)
// 從i節點開始調整,n為節點總數 從0開始計算 i節點的子節點為 2*i+1, 2*i+2
void minheapfixdown(int a, int i, int n)
a[i] = temp;
}
void minheapdeletenumber(int a, int n)
//建立最小堆
void makeminheap(int a, int n)
// 堆排序 最小堆 –> 降序排序
void minheapsorttodescendarray(int a, int n)
}
8種排序演算法
學習了這麼多的排序演算法,還沒有做個總結,呵呵 氣泡排序 氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是o n 2 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來說...
8種排序演算法
1.選擇排序 兩層迴圈巢狀,0到n 1選出最小的,與第0個交換,縮小集合為1到n 1,選出最小的,與第乙個交換 時間複雜度 o n2 空間複雜度 因為中間只增加了兩個新變數,儲存最小值和下標,所以空間複雜度為o 1 當陣列為已排序狀態時,仍需要n次比較,最好的情況仍需要o n2 public sta...
8種排序演算法
public class sortcode a j 1 insertnum 找到位置,插入當前元素 system.out.println 直接插入排序後的陣列為 arrays.tostring a 2.希爾排序 針對直接插入排序的下效率問題,有人對次進行了改進與公升級,這就是現在的希爾排序。希爾排序...