연쇄표 정렬-거품법

정렬에 대해 모두가 낯설지 않을 것이라고 믿는다. 수조에 대해 말하자면 우리는 많은 정렬을 능숙하게 응용할 수 있다. 예를 들어 거품, 선택, 빠른 배열 등이다.체인 테이블의 순서에 대해 지난 학기에 과정 설계를 할 때 이 문제를 소홀히 한 다음에 최근에야 실제 조작을 했습니다. 그 결과 문제가 매우 많은 것을 발견했고 실제적으로 해결하면서 배운 것이 있어서 여러분께 공유하기로 결정했습니다.

정렬된 코드


우선, 여러분께 체인 테이블의 정렬 코드를 첨부한 다음에 그 중에서 운행하는 과정, 그리고 제가 처음에 썼을 때 겪은 문제를 설명하겠습니다.
void buttle_sort(node *arr[], int number)
{
    int i, j;
    node *phead;
    node *temp, *loop;
    node *q;

    for(i = 0; i < number; i++)
    {
        phead = arr[i];

        if(phead -> next == NULL || phead == NULL)
        {
            return ;
        }

        for(j = 0; j <= (phead -> count); j++) //          
        {
            for(q = phead; q -> next -> next != NULL; q = q -> next)
            {
                if(q->next->expn > q->next->next->expn)
                {
                    temp = q -> next;
                    loop = q -> next -> next;
                    q -> next = loop;
                    temp -> next =  loop -> next;
                    loop -> next = temp;
                }
            }
        }
    }
}

위의 프로그램은 내가 당시에 다항식 연산기를 쓰는 데 사용한 것이다. 모두가 정렬 부분에 대해 내부의 이중 순환, 즉 내가 주석한 부분만 볼 수 있다.

도대체 어떻게

  • 체인 테이블의 거품 정렬에 대해 사상이 복잡하지 않다. 이것은 수조에 대한 거품 정렬과 사실 본질적으로 똑같다. 일부 사람들이 쓰지 않은 이유는 대부분 학우들이 정렬 과정에서 서로 바뀌어야 하는 두 결점의 과정에 대해 쓰지 않았다고 믿는다.
  • 사실 사고방식은 매우 간단하다. 우선, 우리는 세 개의 지침을 설정해야 한다. 프로그램에서 나는 각각 *q, *temp, *loop 세 개의 결점을 가리키는 지침을 설정했다.내가 설정한 체인 시계는 두결점을 가지고 있기 때문에 우리는 먼저 q로 체인 시계의 머리를 가리킨 다음에temp,loop으로 q결점 이후의 두 결점, 즉 교환이 필요할 수 있는 두 결점을 각각 기록한다.만약 이 결점이 확실히 교환이 필요하다면 매우 간단하다. q->next=loop;temp -> next = loop -> next; loop -> next = temp; 간단한 두 결점이 서로 위치를 바꾸면 누구나 할 수 있는 조작이다.이렇게 해서 우리는 체인 시계의 거품 정렬을 쉽게 실현하였다.

  • 내가 당초에 겪은 문제


    내가 처음으로 체인 테이블의 거품 정렬을 진행할 때 쓰기 전의 사고방식은 매우 간단했다. 바로 수조형의 거품 정렬 템플릿을 거기에 놓고 그것을 고쳐서 체인 테이블이 적용되는 것이라고 하면 된다.그러나 처음 썼을 때 내 프로그램은 바로 실행할 수 없었다.그리고 나서 나는 이런 몇 가지 문제를 발견했다.
  • 결점 교환 시 교환에 혼란이 발생합니다.(교환된 체인표에 노드가 분실된 상황이 존재한다) 사실 이런 상황이 발생하는 것은 우리의 순서에 문제가 있는 것이 아니라 우리가 결점을 기록하는 방식이고 교환하는 과정에 문제가 발생할 수 있다.
  • 세그먼트 오류입니다.(일반적으로 메모리가 넘치거나 접근이 경계를 넘는 경우) 나는 이 q->next->next!=NULL, 우리는 항상 생각이 엄격하지 않아서 q->next!=NULL의 이런 상황에서 loop 변수에 대해 말하자면 그의 방문은 경계를 넘었다. 왜냐하면 체인 테이블 정렬에서 우리는 수조처럼 간단하게 제3변수를 도입하면 두 위치의 값을 교환할 수 없기 때문이다.체인 테이블에서 우리는 세 개의 결점의 위치를 알아야만 두 개의 결점 위치의 교환을 실현할 수 있다. 그러면 첫 번째 오류가 발생하는 상황을 해결하고 교환 결점을 확보하는 과정에서 체인 테이블이 혼란스럽지 않을 것이다.
  • 좋은 웹페이지 즐겨찾기