排序算法比较总结

冒泡排序

每次从头开始(每次结束可以不到最后,因为上一次已经确定最大值在末尾了),比较相邻两个数,每次下沉一个最大值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  #include <iostream>
using namespace std;
 
void bubbleSort(int a[], int length)
{
    bool swapFlag;
    for (int i = 1; i < length; i++)  //两个数,冒泡排序1次;length个数,冒泡排序length-1次。
    {
        swapFlag = false;
        for (int j = 0; j < length - i; j++) //注意终止条件length-i,每次下沉一个最大数,不用比较到最后已确定的数。
        {
            if (a[j] > a[j+1])
            {
                swapFlag = true;
                swap(a[j], a[j+1]);
            }
        }
 
        if (swapFlag == false)
        {
            break;
        }
    }
}
 
int main() {
    int array[9] = {50, 10, 90, 30, 70, 40, 80, 60, 20};
 
    bubbleSort(array,9);
 
    for (int i = 0; i < 9; i++)
    {
        cout << array[i] << endl;
    }
    return 0;
}

插入排序

将数插入到已排序数组中。

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
  #include <iostream>
#include <vector>
using namespace std;
 
template <class T>
void insertSort(vector<T> &vec)
{
 
    for (int i = 1; i < vec.size(); i++)
    {
        int j;
        T tmp = vec[i];
 
        for (j = i; (j > 0) && (tmp < vec[j-1]); j—) //是后移,不是交换。
        {
            vec[j]=vec[j-1];
        }
 
        vec[j] = tmp;
    }
}
 
int main()
{
    int array[9] = {50, 10, 90, 30, 70, 40, 80, 60, 20};
    vector<int> intVec(array, array + 9);
    insertSort(intVec);
 
    for (vector<int>::iterator iter = intVec.begin(); iter != intVec.end(); iter++) {
        cout << *iter << endl;
    }
}

希尔排序

缩减增量排序,特殊的插入排序,每个增量的排序都是插入排序。

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
  #include <iostream>
#include <vector>
using namespace std;
 
void shellSort(vector<int> &a, int length)
{
    for (int gap = length / 2; gap > 0; gap /= 2)
    {
        for (int i = gap; i < length; i++)
        {
            int j;
            int tmp = a[i];
 
            for (j = i; (j - gap >= 0) && (tmp < a[j-gap]); j -= gap)
            {
                a[j] = a[j-gap];
            }
            a[j] = tmp;
        }
    }
}
 
 
int main() {
    int a[] = {9,8,7,6,5,4,3,2,1,0,11};
    vector<int> vec(a, a+11);
    shellSort(vec, 11);
 
 
    for (vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++) {
        cout << *iter << endl;
    }
 
    return 0;
}

快速排序

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
  #include <iostream>
#include <vector>
using namespace std;
 
void quicksort(vector<int> &v, int left, int right)
{
    if (left >= right)
    {
        return;
    }
 
    int low = left;
    int high = right;    //right是结束位,right-1是倒数第一个数。
    int pivot = v[low];  //第一个值作为中枢值。
 
    while (low < high)
    {
        while (low < high && v[--high] > pivot)//--high从倒数第一个数向前找到第一个不大于key的值。
            NULL;
        while (low < high && v[++low] < pivot)//从第2个数(v[low+1])向后找到第一个不小于key的值(v[low]是中枢值,不参与排序).
            NULL;
 
        if (low < high)
        {
            swap(v[low], v[high]);
        }
        else
        {
            break;
        }
    }
 
    swap(v[low], v[left]); //将中枢值与不大于中枢值的最大值交换,至此,v[low]是本次排序中枢值,low左边的数都不大于中枢值,low右边的数都不小于中枢值。
    quicksort(v, left, low);
    quicksort(v, low + 1, right);
}
 
int main()
{
    int a[10] =     { 9,8,7,9,5,4,3,2,1,0 };
 
    vector<int> vec(a, a + 10);
    quicksort(vec, 0, 10);
    for (vector<int>::iterator iter = vec.begin(); iter != vec.end();iter++)
    {
        cout << *iter << endl;
    }
 
    return 0;
}

排序算法比较

image

原文地址:https://www.cnblogs.com/helloweworld/p/3176458.html