데이터 구조 및 알고리즘 기반(Wang Zhuo)(34): 교환 정렬의 버블 정렬

목차

전제 조건:

버블 정렬: (우리 [이전 정렬 순서 테이블]의 전제 조건에 따라 나중에 반복하지 않습니다.)

첫 번째 단계:

처음/순회하는 경우 먼저 마지막/가장 큰 요소를 결정합니다.

2단계:

알아채다:

또한 이전에 이 내용을 어떻게 배웠는지 검토하고 싶다면 다음을 볼 수 있습니다.

세 번째 단계:

아이디어:

방법:

성취하다:


전제 조건:

#include<iostream>
using namespace std;

#define MAXSIZE 20  //记录最大个数
typedef int KeyType;  //关键字类型

typedef int InfoType;

//定义每个记录(数据元素)的结构
struct RecType
    //Record Type:每条记录的类型
{
    KeyType key;  //关键字
    InfoType otherinfo;  //其他数据项
};

struct SqList
    //顺序表(的)结构
{
    RecType r[MAXSIZE + 1];
    //类型为【记录类型】的数组
    //r[0]一般做哨兵或缓冲区
    int length;  //顺序表长度
};

버블 정렬: (우리 [이전 정렬 순서 테이블]의 전제 조건에 따라 나중에 반복하지 않습니다.)


첫 번째 단계:

처음/순회하는 경우 먼저 마지막/가장 큰 요소를 결정합니다.

(첫 번째) 버블 정렬 프로그램 작성

void BubbleSort(SqList& L)
{
    for (int i = 1; i <= L.length; i++)
    {
        if (L.r[i].key > L.r[i + 1].key)
        {
            L.r[0] = L.r[i + 1];
            L.r[i + 1] = L.r[i];
            L.r[i] = L.r[0];
        }
    }
}

기본 데이터 위치는 비트 오더가 1인 위치부터 저장되며, 0의 위치는 비워져 센티넬/임시 저장 공간으로 저장됩니다. 


2단계:

각 후속 루프는 나머지 요소의 마지막 요소를 결정합니다.

정렬 및 비교할 수 있는 나머지 요소는 점점 줄어들고 있으며 주기가 정렬될 때마다 가장
큰 요소가 결정되고 정렬 및 비교를 위해 입력(가져올)할 요소가 하나 더 적습니다. 다음 라운드

그저 그래:

void BubbleSort(SqList& L)
{
    for (int j = L.length; j > 0; j--)
        //j > 1 是不是也可以?
        //反正最后都只剩下一个元素了,肯定是最小的那一个,你还比什么比
        for (int i = 1; i < j; i++)
        {
            if (L.r[i].key > L.r[i + 1].key)
            {
                L.r[0] = L.r[i + 1];
                L.r[i + 1] = L.r[i];
                L.r[i] = L.r[0];
            }
        }
}

 j는 다음을 의미합니다.

매번 (이번) 루프를 비교할 때 얼마나 많은 요소를 비교합니까?

이 주기는 전체 정렬 테이블에서 번호/가장 큰 요소를 결정합니다.

그리고 i는 매번 비교에 사용되는 이전 요소를 가리키는 데 사용됩니다.


알아채다:

여러 주기에 대한 폐루프 설계 문을 완성한 이전 단계 외에도 주목해야 할 또 다른 변경 사항이 있습니다.

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

여기서 우리가 사용하는 기호는 앞에서 사용한 "<=" 대신 "<"입니다.

여기서의 이러한 변화는 우리 버블 정렬 알고리즘의 핵심 중 하나라고 할 수 있습니다.

그 이유는 실제로 매우 간단합니다.

우리가 비교하는 객체는 다음과 같습니다. Lr[i].key 및 Lr[i + 1].key

아님: Lr[i].key 및 Lr[i - 1].key

물론 사실은 2단계와 1단계가 별차이가 없다는게 아니라 사실 1단계에서 우리도 실수를 했을뿐 ㅋㅋㅋ


또한 이전에 이 내용을 어떻게 배웠는지 검토하고 싶다면 다음을 볼 수 있습니다.

도서 P85 예제 5-3 버블 알고리즘 problem_i<k, Nuo a[i is less than a[k]_宇-Yu's Blog-CSDN Blog

하지만 개인적으로 그럴 필요는 없다고 생각합니다. 제가 여기에 쓴 것(직접 쓴 것)이 명확하고 편안하다고 느끼기 때문입니다.

이전 글이 엉망진창으로 쓰였네요 ㅎㅎ


어쨌든 이 버블 정렬을 작성하는 방법에 대해서는 사실 여전히 다릅니다. 일부 버전은 아래에 수집되어 있지만 내 생각이 옳다는 것을 알고 있으면 작동한다고 생각합니다.


Github 버전:

    for(int i=0;i<L.length;++i)
    {
        for(int j=0;j<L.length - i;++j)

PPT 표준 답변:

void BubbleSort(SqList& L) 
{
    int i, j, m;
    RecType temp; //交换时临时储存
    bool flag = 1;  //标记是否有交换
    for (m = 1; m < L.length - 1 && flag; m++) 
    {
        flag = 0;
        for (j = 1; j <= L.length - m; j++) 
        {
            if (L.r[j].key > L.r[j + 1].key) 
            {  
                flag = 1;
                temp = L.r[j];
                L.r[j] = L.r[j + 1];
                L.r[j + 1] = temp;
            }
        }
    }
}

또한 이전 글에서 쓴 다른 글쓰기 방법에 대해서는 여기서 반복하지 않겠으니 관심 있는 분들은 직접 가보시면 됩니다.


세 번째 단계:

PPT에서 위에서 언급한 개선 방법에 추가:

아이디어:

각 정렬은 이전의 모든 요소로 구성된 전체 테이블을 통과하기 때문에 다음과 같습니다.

순회가 있으면 이전 요소가 이미 순서대로 있으므로 작업 및 위치 교환이 필요하지 않습니다.

그게 다야, 전체 테이블이 정상입니다

나중에 순회 작업을 반복할 필요가 없습니다.

방법:

이전 정렬에서 이전 요소가 순서대로 있는지 여부를 표시하는 플래그를 설정하고 플래그 = 0이면 트래버스할 필요가 없습니다.

성취하다:

이 사고 과정을 현지화하십시오.

void BubbleSort(SqList& L)
{
    bool flag = 1;
    for (int j = L.length; j > 0 && flag; j--)
        for (int i = 1; i < j; i++)
        {
            flag = 0;
            if (L.r[i].key > L.r[i + 1].key)
            {
                flag = 1;
                L.r[0] = L.r[i + 1];
                L.r[i + 1] = L.r[i];
                L.r[i] = L.r[0];
            }
        }
}

추천

출처blog.csdn.net/Zz_zzzzzzz__/article/details/130292839