排序算法

一.冒泡排序:

复制代码
 1 #include "stdio.h"
 2 int main()
 3 {
 4     int a[10] = {1,3,4,2,6,9,8,7,10,5};
 5     for(int i = 0;i < 9;i++)//为什么只有9次外循环? 因为10个数只需要进行9次比较,
 6         for(int j = 0;j < 9 - i;j++)//为什么要从0开始到9 - i, 因为是从前往后冒泡,每次会排好未排好序列最后一个数
 7             if(a[j] > a[j + 1]){
 8                 int temp = a[j];
 9                 a[j] = a[j + 1];
10                 a[j + 1] = temp;
11             }
12 
13     for(int i = 0;i < 10;i++)
14         printf("%d ",a[i]);
15     return 0;
16 }
复制代码

二.选择排序:

复制代码
 1 #include "stdio.h"
 2 int main()
 3 {
 4     int a[10] = {10,9,8,7,6,5,4,3,2,1};//1,3,4,2,6,9,8,7,10,5
 5     for(int i = 0;i < 9;i++){//所谓选择排序就是每次都找一个找小或者最大值放到最后或者最前面的位置
 6         int min = i;//选择位置
 7         for(int j = i + 1;j < 10;j++)
 8             if(a[min] > a[j])   min = j;//如果有比这个数小的,则更新下标
 9         if(min != i) {
10             int temp = a[i];
11             a[i] = a[min];
12             a[min] = temp;
13         }
14     }
15 
16     for(int i = 0;i < 10;i++)
17         printf("%d ",a[i]);
18     return 0;
19 }
复制代码

三.直接插入排序:

复制代码
 1 #include "stdio.h"
 2 int main()
 3 {
 4     int a[10] = {1,3,4,2,6,9,8,7,10,5};
 5     for(int i = 1;i < 10;i++){//插入排序第一个相当于是已经排好了的,只需要把后面的往前面插入即可
 6         int temp = a[i];//保存需要插入的值
 7         int j;
 8         for(j = i - 1;j >= 0 && a[j] > temp;j--)//这个循环只要是查找插入的位置
 9             a[j + 1] = a[j];
10         a[j + 1] = temp;//进行插入
11     }
12     for(int i = 0;i < 10;i++)
13         printf("%d ",a[i]);
14     return 0;
15 }
复制代码

四.二分法优化后的直接插入排序:

复制代码
 1 #include "stdio.h"
 2 int binery_search(int l,int r,int *a,int temp)
 3 {
 4     while(l <= r){
 5         int m = (l + r) / 2;
 6         if(a[m] <= temp)
 7             l = m + 1;
 8         else 
 9             r = m - 1;
10     }
11     return r;
12 }
13 int main()
14 {
15     int a[10] = {1,3,4,2,6,9,8,7,10,5};
16     for(int i = 1;i < 10;i++){
17         int index = binery_search(0,i-1,a,a[i]);//进行二分搜索插入位置
18         if(i != index){//当属于当前位置时不用插入
19             int temp = a[i];
20             int j;
21             for(j = i - 1;j > index;j--)
22                 a[j + 1] = a[j];
23             a[j + 1] = temp;
24         }
25     }
26 
27     for(int i = 0;i < 10;i++)
28         printf("%d ",a[i]);
29     return 0;
30 }
复制代码

五.希尔排序:

复制代码
 1 #include "stdio.h"
 2 int main()
 3 {
 4     int m = 10 / 2;
 5     int a[10] = {1,3,4,2,6,9,8,7,10,5};
 6     while(m > 0){//希尔排序实际上就是一个带间隔的插入排序
 7         for(int i = m;i < 10;i++){
 8             int temp = a[i];
 9             int j;
10             for(j = i - m;j >= 0 && a[j] >= temp;j -= m)
11                 a[j + m] = a[j];
12             a[j + m] = temp;
13         }
14         m /= 2;
15     }
16     for(int i = 0;i < 10;i++)
17         printf("%d ",a[i]);
18     return 0;
19 }
复制代码

六.快速排序:

复制代码
 1 #include "stdio.h"
 2 void quick_sort(int *a,int s,int e)
 3 {
 4     int i = s,j = e;
 5     if(s > e) return;//如果已经排好了则返回
 6     int temp = a[s];
 7     while(i < j){
 8         while(i < j && a[j] >= temp)
 9             j--;
10         while(i < j && a[i] <= temp)
11             i++;
12         if(i < j){//两两交换
13             int t = a[j];
14             a[j] = a[i];
15             a[i] = t;
16         }
17     }
18     a[s] = a[i];//把基准位置的值和序列位置的值互换
19     a[i] = temp;
20     quick_sort(a,s,i - 1);
21     quick_sort(a,i + 1,e);
22 }
23 int main()
24 {
25     int a[10] = {1,3,4,2,6,9,8,7,10,5};
26     quick_sort(a,0,9);
27     for(int i = 0;i < 10;i++)
28         printf("%d ",a[i]);
29     return 0;
30 }
复制代码

七.归并排序:

复制代码
 1 #include "stdio.h"
 2 void merge(int *a,int s,int m,int e)
 3 {
 4     int temp[10];//临时存储数据
 5     int l,r,k;//代表左右两个区间的指针 k代表临时数组的数的个数
 6     l = s,r = m + 1,k = 0;
 7     while(l <= m && r <= e){
 8         if(a[l] < a[r])
 9             temp[k++] = a[l++];
10         else 
11             temp[k++] = a[r++];
12     }
13     while(l <= m)
14         temp[k++] = a[l++];
15     while(r <= e)
16         temp[k++] = a[r++];
17     for(int i = 0;i < k;i++)
18         a[s + i] = temp[i];
19 }
20 void merge_sort(int *a,int s,int e)
21 {
22     if(s == e) return;//如果此序列为只有一个数的子序列了,则不需要排序了
23     else{
24         int m = (s + e) / 2;
25         merge_sort(a,0,m);
26         merge_sort(a,m + 1,e);
27         merge(a,s,m,e);
28     }
29 }
30 int main()
31 {
32     int a[10] = {1,3,4,2,6,9,8,7,10,5};
33     merge_sort(a,0,9);
34     for(int i = 0;i < 10;i++)
35         printf("%d ",a[i]);
36     return 0;
37 }
复制代码

 八、堆排序

堆排序的话利用了完全二叉树的性质,主要是查找速度达到了logn,只需查找n次,故时间复杂度为nlogn

复制代码
 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 int a[10010];
 4 void HeapAdjust(int s,int e)
 5 {
 6     while(s * 2 < e) {
 7         int vis = s;
 8         if(a[vis] < a[s * 2])//看他的做孩子是否大于他
 9             vis = s * 2;
10         if(s * 2 + 1 < e)
11             if(a[vis] < a[s * 2 + 1])//看他的右孩子是否大于他
12                 vis = s * 2 + 1;
13         if(s != vis){//交换,然后再进行交换的那个节点调整
14             swap(a[s],a[vis]);
15             s = vis;
16         }
17         else
18             break;
19     }
20 }
21 void HeapSort(int n)
22 {
23     for(int i = n / 2;i >= 0;i--)//调整堆
24         HeapAdjust(i,n);
25     for(int i = n - 1;i >= 1;i--) {//每次把最大的放在堆顶然后与尾巴交换,因为最后只剩下一个了就不需要调整堆了
26         swap(a[0],a[i]);
27         HeapAdjust(0,i);
28     }
29 }
30 int main()
31 {
32     int n;
33     cin >> n;
34     for(int i = 0;i < n;i++)
35         cin >> a[i];
36     HeapSort(n);
37     for(int i = 0;i < n;i++)
38         cout << a[i] << ' ';
39     return 0;
40 }
复制代码

 

posted @   scannerkk  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示