버블, 선택 및 빠른 세 가지 기본 정렬 알고리즘

버블 정렬의 기본 아이디어는 인접한 두 요소를 매번 비교하고 순서가 잘못된 경우 교환하는 것입니다.

 

상:

버블 정렬 핵심 프로그램

void M_Sort(int arr[], int num)   //冒泡  也可以这样写void M_sort(int *arr,int num)   因为数组名就是数组的首地址

{

    for (int i = 0; i < num - 1; i++)//n个数排序,只用进行num-1趟

    {

        for (int j = 0; j < num - i - 1; j++)//从第0位开始比较直到最后一个尚未归位的数,想一想为什么到n-i-1就可以了(如果还想不懂就看下那个动态图)

        {

            if (arr[j] > arr[j + 1])//这里控制的是排序后的数组是从大到小还是从小到大

            {

                int Temp = arr[j];

                arr[j] = arr[j + 1];

                arr[j + 1] = Temp;

            }

        }

    }

}

 

 

 

정렬 선택

간단하고 직관적 인 정렬 알고리즘 인 직접 선택 정렬 (Selection Sort). 먼저 정렬되지 않은 시퀀스에서 가장 작은 (큰) 요소를 찾고 정렬 된 시퀀스의 시작 부분에 저장 한 다음 나머지 정렬되지 않은 시퀀스 요소에서 가장 작은 (큰) 요소를 계속 찾은 다음 정렬 된 시퀀스의 끝에 배치합니다. . 그리고 모든 요소가 정렬 될 때까지 계속됩니다.

 

그림과 같이 작동

 

코드 (C ++ 11 표준으로 작성된 VC6.0에서 컴파일되지 않음)

예 :

#include <iostream>

#include <algorithm>

using namespace std;

void SelectSort(int *a, int n)

{

    for (int i = 0; i < n - 1; i++)

    {

        for (int j = i+1; j < n; j++)

        {

            if (a[j] < a[i])

            {

                swap(a[j], a[i]);//swap函数没写是因为algorithm算法库里有这个方法,就没自己写了

            }

        }

    }

}

int main()

{

    int a[] = { 2,1,6,9,5,7,3 };

    SelectSort(a, 7);

    for (auto &s : a)//改成for(int i=0;i<7;i++) cout<<a[i]<<" "; cout<<endl; 在VC6.0上就能编译了

    {

        cout << s << " ";

    }

    cout << endl;

    system("pause");//在VC6.0上编译的时候把这个去掉,这是VS2015编译时为了防止点击运行时黑色对话框一闪就关掉

    return 0;

}

 

빠른 정렬 효과 다이어그램 :

 

Quick Sort 나는 Aha Lei의 "Aha Algorithm", 외국 알고리즘 책 "Algorithm Diagram", 그리고 CSDN의 토착 고전 알고리즘 시리즈 6을 읽었습니다. Quick sort CDSN에 대한 간단한 요점을 발췌 한 것 같습니다. CDSN에 대한 빠른 정렬

( http://blog.csdn.net/morewindows/article/details/6684558에서 )

기본 아이디어 : 먼저 참조 번호로 번호 시퀀스에서 번호를 가져옵니다.

2. zoning 과정에서 참조 번호보다 큰 숫자는 모두 오른쪽에 적으십시오 .———————— 파고 채우기 수 + 나누기 정복 방법

기본 숫자보다 작거나 같은 모든 숫자는 왼쪽에 배치됩니다.

삼. 각 간격에 숫자가 하나만있을 때까지 왼쪽 및 오른쪽 간격에 대해 2를 반복합니다.

 

예를 들어 배열을 사용하고 간격의 첫 번째 숫자를 기본 숫자로 사용하십시오.

0 1 2 4 5 6 7 8 9
72 6 57 88 60 42 83 73 48 85

처음에는 i = 0, j = 9, X = a [i] = 72

a [0]의 숫자가 X에 저장 되었기 때문에 a [0] 배열에 구멍이 뚫린 것을 알 수 있으며 여기에 다른 데이터를 채울 수 있습니다.

j에서 시작하여 X보다 작거나 X와 같은 숫자를 찾습니다. j = 8이면 조건이 충족되고 a [8]을 파낸 다음 마지막 구덩이 a [0]에 채 웁니다. a [0] = a [8]; i ++; 이런 구덩이 a [0]는 고정되어 있는데 새로운 구덩이 a [8]이 생겼는데 어떻게해야하나요? 간단하게, a [8]의 구덩이를 채울 숫자를 찾으십시오. 이번에는 i에서 시작하여 X보다 큰 숫자를 찾고 i = 3 일 때 조건을 충족하고 a [3]을 파서 마지막 구덩이에 채 웁니다. a [8] = a [3]; j--;

 

배열은 다음과 같습니다.

0 1 2 4 5 6 7 8 9
48 6 57 88 60 42 83 73 88 85

 나는 = 3; j = 7; X = 72

위의 단계를 다시 반복하여 먼저 뒤에서 앞을 본 다음 앞에서 뒤를 봅니다.

j = 5 일 때부터 기대하기 시작하고, 조건을 충족하고 a [5]를 파 내고 이전 구덩이에 채우십시오. a [3] = a [5]; i ++;

i에서 시작하여 뒤로 보면 i = 5 일 때 i == j이므로 종료합니다.

이때 i = j = 5이고 a [5]는 지난번에 파낸 구덩이가 되었으니 X를 a [5]에 채워 넣으십시오.

 

배열은 다음과 같습니다.

0 1 2 4 5 6 7 8 9
48 6 57 42 60 72 83 73 88 85

a [5] 앞의 숫자는 모두 그보다 작으며 a [5] 뒤의 숫자는 모두 그보다 크다는 것을 알 수 있습니다. 따라서 a [0 ... 4] 및 a [6 ... 9]의 두 하위 구간에 대해 위의 단계를 반복합니다.

 

 

파기 및 채움 횟수 요약

1. i = L; j = R; 벤치 마크 번호를 파내어 첫 번째 구덩이 a [i]를 형성합니다.

2. j-- 뒤에서 앞까지보다 작은 숫자를 찾고이 숫자를 찾아서 이전 구멍 a [i]를 찾은 후 채 웁니다.

삼. i ++는 앞에서 뒤로 더 큰 숫자를 검색하고이 숫자를 파내어 이전 피트 a [j]에 채 웁니다.

4. i == j까지 2 단계와 3 단계를 반복하고 a [i]에 참조 번호를 입력합니다.

 

파기 및 채우기 코드는 다음과 같습니다.

int AdjustArray(int s[], int l, int r) //返回调整后基准数的位置

{

    int i = l, j = r;

    int x = s[l]; //s[l]即s[i]就是第一个坑

    while (i < j)

    {

        // 从右向左找小于x的数来填s[i]

        while(i < j && s[j] >= x) 

            j--;  

        if(i < j) 

        {

            s[i] = s[j]; //将s[j]填到s[i]中,s[j]就形成了一个新的坑

            i++;

        }



        // 从左向右找大于或等于x的数来填s[j]

        while(i < j && s[i] < x)

            i++;  

        if(i < j) 

        {

            s[j] = s[i]; //将s[i]填到s[j]中,s[i]就形成了一个新的坑

            j--;

        }

    }

    //退出时,i等于j。将x填到这个坑中。

    s[i] = x;



    return i;

}

 

 

분할 및 정복 코드 :

void quick_sort1(int s[], int l, int r)

{

    if (l < r)

    {

        int i = AdjustArray(s, l, r);//先成挖坑填数法调整s[]

        quick_sort1(s, l, i - 1); // 递归调用 

        quick_sort1(s, i + 1, r);

    }

}

 

 

조합은 다음과 같습니다.

//快速排序

void quick_sort(int s[], int l, int r)

{

    if (l < r)

    {

        //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1

        int i = l, j = r, x = s[l];

        while (i < j)

        {

            while(i < j && s[j] >= x) // 从右向左找第一个小于x的数

                j--;  

            if(i < j) 

                s[i++] = s[j];

             

            while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数

                i++;  

            if(i < j) 

                s[j--] = s[i];

        }

        s[i] = x;

        quick_sort(s, l, i - 1); // 递归调用 

        quick_sort(s, i + 1, r);

    }

}

 

추천

출처blog.csdn.net/qq_31702609/article/details/81293023