1. 冒泡排序
#include <stdio.h>
int main(void)
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int len = sizeof(a) / sizeof(a[0]);
for(int i=0; i<len-1; i++){
for(int k=0; k<len-1-i; k++){
if(a[k] < a[k + 1]){
int temp = a[k];
a[k] = a[k+1];
a[k+1] = temp;
}
}
}
for(int i=0; i<len; i++){
printf("%d ", a[i]);
}
return 0;
}
2. 選擇法排序
#include <stdio.h>
int main(void)
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int len = sizeof(a) / sizeof(a[0]);
for(int i=0; i<len-1; i++){
for(int k=i+1; k<len; k++){
if(a[i] < a[k]){
int temp = a[i];
a[i] = a[k];
a[k] =temp;
}
}
}
for(int i=0; i<len; i++){
printf("%d ", a[i]);
}
return 0;
}
3. 插入法排序
#include <stdio.h>
int main(void)
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int i, j;
int len = sizeof(a) / sizeof(a[0]);
for(i=1; i<len; i++){
int wait = a[i];
for(j=i-1; j>=0; j--){
if(a[j] < wait){
a[j + 1] = a[j];
}
else{
break;
}
}
a[j + 1] = wait;
}
for(i=0; i<len; i++){
printf("%d ", a[i]);
}
return 0;
}
4. 折半法排序
#include <stdio.h>
void binary_insert_sort(int a[], int len);
int main(void)
{
int a[] = {73,108,112,118,101,70,105,115,104,67,46,99,111,109};
int i, len;
len=sizeof(a) / sizeof(a[0]);
binary_insert_sort(a, len);
for(i=0; i<len; ++i){
printf("%d ",a[i]);
}
return 0;
}
void binary_insert_sort(int a[], int len){
int low, mid, high;
for(int i=1; i<len; ++i){
int temp = a[i];
low = 0;
high = i - 1;
while(low <= high){
mid = (low + high) / 2;
if(temp < a[mid]){
high = mid - 1;
}
else{
low = mid + 1;
}
}
for(int j=i-1; j>high; --j){
a[j + 1] = a[j];
}
a[high + 1] = temp;
}
}
5. 希爾排序
#include <stdio.h>
int main(void)
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int i, j, step;
int len = sizeof(a) / sizeof(a[i]);
for(int step=len/2; step>0; step/=2){
for(i=0+step; i<len; i+=step){
int wait = a[i];
for(j=i-1; j>=0; j--){
if(a[j] < wait){
a[j + 1] = a[j];
}
else{
break;
}
}
a[j + 1] = wait;
}
}
for(i=0; i<10; i++){
printf("%d ", a[i]);
}
return 0;
}
6. 桶排序
#include <stdio.h>
int searchMax(int a[], int len);
int main(void)
{
int max, len;
int a[11] = {1,2,3,4,5,6,7,8,9,10,40};
len = sizeof(a) / sizeof(a[0]);
max = searchMax(a, len);
int bucket[max + 1] = {0};
for(int i=0; i<len; i++){
bucket[a[i]]++;
}
for(int i=max; i>0; i--){
for(int k=bucket[i]; k>0; k--){
printf("%d ", i);
}
}
return 0;
}
int searchMax(int a[], int len){
int max = a[0];
for(int i=1; i<len; i++){
if(a[i] > max){
max = a[i];
}
}
return max;
}
7. 快速排序
#include <stdio.h>
void quick_sort(int a[], int left, int right);
int main(void)
{
int a[] = {73, 108, 112, 118, 101, 70, 105, 115, 104, 67, 46, 99, 111, 109};
int i, len;
len = sizeof(a) / sizeof(a[0]);
quick_sort(a, 0, len-1);
for(i=0; i<len; i++){
printf("%d ", a[i]);
}
return 0;
}
void quick_sort(int a[],int left, int right){
int i = left, j = right;
int key;
key = a[(left + right) / 2];
while(i <= j){
while (a[i] < key){
i++;
}
while (a[j] > key) {
j--;
}
if (i <= j) {
int temp = a[i];
a[i++] = a[j];
a[j--] = temp;
}
}
if(j > left) {
quick_sort(a, left, j);
}
if(i < right) {
quick_sort(a, i, right);
}
}
8. 堆排序
- 父結點索引:(i - 1) / 2(這裏計算機中的除以2,省略掉小數)
- 左孩子索引:2 * i + 1
- 右孩子索引:2 * i + 2
- 最後一個父節點:n / 2 - 1
#include <stdio.h>
void creat_heap(int a[], int len);
void adjust(int a[], int root, int len);
void heap_sort(int a[], int len);
void swap(int *a, int step1, int step2);
int main (void) {
int a[] = {73,108,112,118,101,70,105,115,104,67,46,99,111,109};
int len = sizeof(a) / sizeof(a[0]);
heap_sort(a, len);
for(int i=0; i<len; i++){
printf("%d ", a[i]);
}
return 0;
}
void adjust_heap(int a[], int i, int len){
int j = i*2+1;
while(j < len){
if(j+1<len && a[j] < a[j + 1]){
j++;
}
if(a[i] > a[j]){
break;
}
swap(a, i, j);
i = j;
j = 2*i+1;
}
}
void creat_heap(int a[], int len){
int i;
for(i=len/2-1; i>=0; i--){
adjust_heap(a, i, len);
}
}
void swap(int *a, int step1, int step2) {
int temp = *(a+step1);
*(a+step1) = *(a+step2);
*(a+step2) = temp;
}
void heap_sort(int a[], int len){
creat_heap(a, len);
for(int i=len-1; i>=0; i--){
swap(a, i, 0);
adjust_heap(a, 0, i);
}
}
-
我喜歡他這個動畫:https://www.jianshu.com/p/0d383d294a80
-
先去大佬那看看啥是堆
-
大佬的圖解
-
實在不行去bi站看一眼:https://www.bilibili.com/video/av62952101/?spm_id_from=333.788.videocard.1