C++排序算法小结

近期来闲来无事,整理了一些比较常见的排序算法,都是用C++写的,其中包括:直接插入排序、折半插入排序、冒泡排序、选择排序、快速排序、堆排序、归并排序、希尔排序、基数排序,计数排序和桶排序,总共11种算法,其中时间复杂度为O(n^2)为前4种,中间4中的时间复杂度为O(nlgn),最后3种的时间复杂度为O(n)。下面我们分3个栏目来介绍:n^2排序、nlgn排序和线性排序。

注:A为全局变量,为一维int数组

n^2排序

直接插入排序

类似于扑克牌排序的原理,在斗地主的时候,每当摸到一张牌后就插入到相应的位置,直接插入排序就是这个原理。从数组第一个数开始,比较该数和前面的数的大小,如果前面的数比该数小,则和前面一位的数调换位置,然后继续比较,直到出现一个数比该数小为止。

核心代码如下:

 1 void InsertSort()
 2 {
 3     int i,j;
 4     for(i = 1;i <= N;i++)
 5     {
 6         j = i;
 7         while(j > 0 && A[j] < A[j - 1])
 8         {
 9             swap(A[j],A[j-1]);
10             j --;
11         }
12     }
13 }

折半插入排序

其实这种算法是直接插入排序的一种优化,在一个数与其前面的数字进行比较的时候,取以数组第一个数和该数前一个数为区间的中间的数,类似与二分法。

核心代码如下:

 1 void HalfSort()
 2 {
 3     int i, j, high, low, mid;
 4     for (i = 2; i <= N; i++)
 5     {
 6         A[0] = A[i];
 7         low = 1;
 8         high = i - 1;
 9         while (low <= high)
10         {
11             mid = (low + high) / 2;
12             if (A[0] < A[mid])
13                 high = mid - 1;
14             else
15                 low = mid + 1;
16         }
17         for (j = i - 1; j >= high + 1; j--)
18             A[j + 1] = A[j];
19         A[high + 1] = A[0];
20     }
21 }

冒泡排序

这个排序算法算是我最早接触的算法,原理就是每次内循环一遍就能把最小的数排到前面,这样外循环完后就排好了。

核心算法如下:

 1 void BubbleSort()
 2 {
 3     for(int i = 1;i <= N - 1;i++)
 4     {
 5         for(int j = N;j >= i+1;j--)
 6         {
 7             if(A[j] < A[j - 1])
 8                 swap(A[j],A[j-1]);
 9         }
10     }
11 }

选择排序

和冒泡排序类似,只不过是先找到最小的数的下标,然后再置换到相应的位置。

核心代码如下:

 1 void SelectSort()
 2 {
 3     int i,j,lowkey,lowindex;
 4     for(i = 1;i <= N - 1;i++)
 5     {
 6         lowindex = i;
 7         lowkey = A[i];
 8         for(j = i + 1;j <= N;j++)
 9         {
10             if(A[j]<lowkey)
11             {
12                 lowkey = A[j];
13                 lowindex = j;
14             }
15         }
16         swap(A[i],A[lowindex]);
17     }
18 }

nlgn排序

快速排序

这个排序算法在nlgn排序算法中算是比较常见的算法了,速度快而且可以进行不同程度的优化。

算法原理概括为2部分:

•分解:数组A[i..j]被划分为两个(可能为空)子数组A[i..q-1]和A[q+1..j],使得A[i..q-1]中没一个元素都小于等于A[q],而A[q]也小于等于A[q+1..j]中每一个元素。其中,计算下标q也是划分过程的一部分;

•解决:通过递归调用快速排序,对子数组A[i..q-1]和A[q+1..j]进行排序;

返回合适的主元下标,这里是用数组从左到右两个不同的数偏大的为主元:

 1 int FindPivot(int i,int j)
 2 {
 3     int firstkey = A[i];
 4     int k;
 5     for (k = i + 1; k <= j; k++)
 6     {
 7         if (A[k] > firstkey)
 8             return k;
 9         else if (A[k] < firstkey)
10             return i;
11     }
12     return 0;
13 }

划分部分代码:

 1 void Patition(int i, int j, int q)
 2 {
 3     int pivot = A[q];
 4     int l = i;
 5     int r = j;
 6     do
 7     {
 8            swap(A[l],A[r]);
 9     while(A[l] < pivot) l++;
10     while(A[r] >= pivot) r--;
11     }while(l <= r);
12 }

排序代码:

 1 void QuickSort(int i, int j)
 2 {
 3     int q,l,r,pivot;
 4     q = FindPivot(i,j);
 5     if (q != 0)
 6     {
 7         Patition(i,j,q);
 8         QuickSort(i,l-1);
 9         QuickSort(l,j);
10     }
11 }

时间: 2024-10-12 19:41:46

C++排序算法小结的相关文章

排序算法小结

排序算法经过了很长时间的演变,产生了很多种不同的方法.对于初学者来说,对它们进行整理便于理解记忆显得很重要.每种算法都有它特定的使用场合,很难通用.因此,我们很有必要对所有常见的排序算法进行归纳. 我不喜欢死记硬背,我更偏向于弄清来龙去脉,理解性地记忆.比如下面这张图,我们将围绕这张图来思考几个问题. 上面的这张图来自一个PPT.它概括了数据结构中的所有常见的排序算法.现在有以下几个问题: 1.每个算法的思想是什么?     2.每个算法的稳定性怎样?时间复杂度是多少?     3.在什么情况下

常见排序算法小结

排序算法经过了很长时间的演变,产生了很多种不同的方法.对于初学者来说,对它们进行整理便于理解记忆显得很重要.每种算法都有它特定的使用场合,很难通用.因此,我们很有必要对所有常见的排序算法进行归纳. 我不喜欢死记硬背,我更偏向于弄清来龙去脉,理解性地记忆.比如下面这张图,我们将围绕这张图来思考几个问题. 上面的这张图来自一个PPT.它概括了数据结构中的所有常见的排序算法.现在有以下几个问题: 1.每个算法的思想是什么?      2.每个算法的稳定性怎样?时间复杂度是多少?      3.在什么情

【转】排序算法小结

排序算法经过了很长时间的演变,产生了很多种不同的方法.对于初学者来说,对它们进行整理便于理解记忆显得很重要.每种算法都有它特定的使用场合,很难通用.因此,我们很有必要对所有常见的排序算法进行归纳. 我不喜欢死记硬背,我更偏向于弄清来龙去脉,理解性地记忆.比如下面这张图,我们将围绕这张图来思考几个问题. 上面的这张图来自一个PPT.它概括了数据结构中的所有常见的排序算法.现在有以下几个问题: 1.每个算法的思想是什么?      2.每个算法的稳定性怎样?时间复杂度是多少?      3.在什么情

常用排序算法小结

1 #include <stdio.h> 2 #include <stdlib.h> 3 4 5 //the basic bubble sort 6 void maopao1(int *num,int len) 7 { 8 int i,j; 9 int temp; 10 for (i = 0; i < len-1; ++i) 11 { 12 for (j = i+1; j<len; ++j) 13 { 14 if (num[i]>num[j]) 15 { 16 t

各种排序算法小结和实现

各种排序算法想必大家都不陌生,定义我就不多介绍了,直接写下自己的一些小结. 快速排序:可以算的上应用最广的排序算法.其排序思路是随机选取一个数字作为标志,使得小于它的数在它左边,大于它的数在它的右边,然后递归对两边的数据排序. 归并排序:应用分之的思想,先将要排序的分为两列,然后分别进行排序,然后合并到另一 个数组中,最后再进行把它复制回来. 冒泡排序:是稳定排序,适用于排列的数组较小而且基本有序,否则时间复杂度太高. 选择排序:和冒泡排序差不多,差别是冒泡是相邻的比较,最后选出最大的或者最小的

十大经典排序算法小结

排序可以说是套路最多的基本算法了,今天来了兴致,那就总结一下这十大排序算法吧. 冒泡法: 这可以算是知名度最高的算法之一了吧,可以说不会这个算法都不好意思说自己写过代码.冒泡排序是最简单的排序之一了,其大体思想就是通过与相邻元素的比较和交换来把小的数交换到最前面.这个过程类似于水泡向上升一样,因此而得名.不多说了,直接上代码: #include<iostream> #include<algorithm> using namespace std; #define LEN 6 int

【C/C++】排序算法小结

1.计数排序 如果给定上下界,并且区间不大的话,最适用. 比如对于英文字母数组进行排序. 时间复杂度O(n),空间复杂度O(n) void countSort(int A[], int n, int low, int high) { int size = high-low+1; vector<int> count(size, 0); //count[i] represents low+i appears count[i] times in A for(int i = 0; i < n;

排序算法小结(Java)1:冒泡排序

冒泡排序:冒泡排序是排序算法中较简单的排序算法: 它从第一个元素开始重复地走访过要排序的数列,一次比较两个元素,如果a[j]>a[j+1]就把他们交换过来,知道最后一个元素,这样未被排序的元素中最大元素"浮"到数列顶端:接着对未排序元素重复之前操作,数组完成排序. public class BubbleSort { public void sort(int a[]){ int temp = 0; for(int i=a.length-1; i>0; i--){//i为未被排

三种排序算法小结

首先是归并排序,基本思想为分治,合并的技巧比较重要,不是原址排序. 代码如下; int merge(int* x,int left,int mid,int right) { int i,j,k; int L1 = mid-left+2; int L2 = right-mid+1; int* L = new int[L1]; int* R = new int[L2]; memcpy(L,x+left,sizeof(int)*L1); memcpy(R,x+mid+1,sizeof(int)*L2)