各种排序总结

Posted hbhdhd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了各种排序总结相关的知识,希望对你有一定的参考价值。

代码中所有数组都是 1~n。

1、冒(起)泡排序

技术图片
1 void sort1( int a[],int n)
2 
3     for(int i=1; i<=n-1; i++)
4         for(int j=1; j<=n-i; j++)
5             if(a[j+1]<a[j])
6                 swap(a[j],a[j+1]);
7 
C++

2、选择排序

技术图片
 1 void sort2(int a[],int n)
 2 
 3     for(int i=1;i<=n;i++)
 4     
 5         int k=i;
 6         for(int j=i;j<=n;j++)
 7         if(a[j]<a[i])
 8         k=j;
 9         swap(a[k],a[i]);
10     
11 
C++

3、归并排序

技术图片
 1 void Merge(int *a,int l,int m,int r)
 2 
 3     //将两个有序的子数组R[l,m)和R[m+1,r]归并成一个有序 R[l,r]
 4     int cnt1=l;
 5     int cnt2=m+1;
 6     int k=1;
 7     int s[r-l+5];//大小自定
 8     while(cnt1<=m&&cnt2<=r)
 9         s[k++]=a[cnt1]>a[cnt2]? a[cnt2++]:a[cnt1++];
10     while(cnt1<=m)
11         s[k++]=a[cnt1++];
12     while(cnt2<=r)
13         s[k++]=a[cnt2++];
14     for(int i=l; i<=r; i++)
15         a[i]=s[i-l+1];
16 
17 void Merge_sort(int a[],int l,int r)
18 
19     if(l<r)
20     
21         int m=(l+r)/2;
22         Merge_sort(a,l,m);
23         Merge_sort(a,m+1,r);
24         Merge(a,l,m,r);
25     
26 
C++(1)
技术图片
1 void sort3(int *a,int n)
2 
3     for(int cnt=2; cnt/2<n; cnt*=2) //每次的排序间隔
4         for(int i=1; i<=n; i+=cnt)
5             sort(a+i,a+min(cnt+i,n+1));
6 
C++(2)

第二个是看别人的博客的,忘记在哪了,应该不是归并,我也不知道是啥

4、插入排序

技术图片
 1 void sort4(int a[],int n)
 2 
 3     //从2~n遍历数组,对于每个i,将1~i排序
 4     int j;
 5     for(int i = 2; i <= n; i++)
 6     
 7         int tmp = a[i];
 8         j=i;
 9         while(j>=1&&a[j]>=tmp)
10             
11                 a[ j ]= a[j-1];
12                 j--;
13             
14         a[j+1]=tmp;
15     
16 /*
17     for(int i=2; i<=n; i++)
18         sort(a+1,a+i+1);//sort排序的区间是左开右闭
19     直接用这两行有点狗啊哈哈
20 */
21 
C++

5、快速排序

快速排序算法:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边。

技术图片
 1 void quick_sort(int *a,int l,int r)
 2 
 3     if(l<r)
 4     
 5         int i,j,tmp;
 6         i=l;
 7         j=r;
 8         tmp=a[i];
 9         while(i<j)
10         
11             while(i<j&&a[j]>tmp)
12                 j--;// 从右向左找第一个小于x的数
13             while(i<j&&a[i]<tmp)
14                 i++;// 从左向右找第一个大于x的数
15             if(i<j)
16                 a[j--]=a[i];
17         
18         a[i]=tmp;
19         quick_sort(a,l,i-1);
20         quick_sort(a,i+1,r);
21     
22 
C++(递归)

6、堆排序

技术图片
 1 void max_heapify(int num[], int i, int last)
 2 
 3     int index;
 4     if(2 * i + 2 <= last)
 5         if(num[2 * i + 1] < num[2 * i + 2])
 6             index = 2 * i + 2;    
 7             
 8         else
 9             index = 2 * i + 1;    
10         
11         if(num[i] < num[index])
12             swap(num[i], num[index]);    
13             max_heapify(num, index, last);
14         
15         
16     else if(2 * i + 1 <= last)
17         if(num[2 * i + 1] > num[i])
18             swap(num[i], num[2 * i + 1]);    
19             
20     
21 
22 
23 void build_maxheap(int num[], int n)
24 
25     for(int i = n - 1; i >= 0; i --)
26         max_heapify(num, i, n - 1);    
27         
28 
29 
30 void heapsort(int num[], int n)
31 
32     build_maxheap(num, n);    
33     for(int i = n - 1; i > 0; i --)
34         swap(num[0], num[i]);    
35         max_heapify(num, 0, i - 1);
36     
37 
C++
技术图片
 1 void heapify(int arr[], int n, int i)
 2     if(i >= n) return ;
 3     int l = 2 * i + 1;
 4     int r = 2 * i + 2;
 5     int max = i;
 6     if(l < n && arr[l] > arr[max]) max = l;
 7     if(r < n && arr[r] > arr[max]) max = r;
 8     if(max != i)
 9         swap(arr[i], arr[max]);
10         heapify(arr, n, max); //max代表的就是左右孩子的下标 
11     
12 
13 void heapSort(int arr[], int n)
14     int last_node = n - 1;
15     int parent = (last_node - 1) / 2;
16     
17     for(int i = parent; i >= 0; i--) //调整堆 
18         heapify(arr, n, i);
19     
20     for(int i = n - 1; i >= 0; i--)
21         swap(arr[0], arr[i]);
22         heapify(arr, i, 0); //0~i之间的数进行调整 
23      
24  
25 ————————————————
26 版权声明:本文为CSDN博主「姚军博客」的原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接及本声明。
27 原文链接:https://blog.csdn.net/SYaoJun/article/details/99694077
View Code

以上是关于各种排序总结的主要内容,如果未能解决你的问题,请参考以下文章

各种排序算法的实现总结

各种排序总结

各种排序总结与自写(归并排序)

各种排序算法总结

各种排序算法分析总结(待整理))

各种排序算法总结篇(高速/堆/希尔/归并)