목차
버블 정렬: (우리 [이전 정렬 순서 테이블]의 전제 조건에 따라 나중에 반복하지 않습니다.)
처음/순회하는 경우 먼저 마지막/가장 큰 요소를 결정합니다.
또한 이전에 이 내용을 어떻게 배웠는지 검토하고 싶다면 다음을 볼 수 있습니다.
전제 조건:
#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];
}
}
}