[데이터 구조] 기본 : 6 가지 정렬 알고리즘 (단순 삽입 정렬, 언덕 정렬, 버블 정렬, 빠른 정렬, 단순 선택 정렬, 힙 정렬)

I. 소개

데이터 구조에는 연결 목록 (스택 및 큐 포함), 이진 트리, 그래프, 검색 및
정렬의 5 개의 테스트 포인트 만 있습니다. 세 가지 정렬 테스트 포인트 : 모든 정렬 알고리즘 비교 + 각 정렬 알고리즘의 원리 + 각 정렬 알고리즘의 특성

둘째, 간단한 삽입 정렬

2.1 데모 + 실행 결과

#include <iostream>

using namespace std;
void InsertSort(int r[],int n)   //0号单元为暂存单元和监视哨    
{
    
    
    int j=0;
    for(int i=2; i<=n; i++)
    {
    
    
        r[0]=r[i];                     //用于暂存待排序元素  
        for ( j=i-1; r[0]<r[j]; j--)    //寻找合适的插入位置
            r[j+1]=r[j];                  //移动
        r[j+1]=r[0];
    }

}
int main()
{
    
    
    int a[5];
    for (int i=0; i<5; i++)
        cin>>a[i];
    cout<<endl;
    InsertSort(a,5);
    for (int i=1; i<5; i++)
    {
    
    
        cout<<a[i];
        cout<<" ";
    }
    cout<<endl;
    return 0;
}

작업 결과 :

​​​​여기에 사진 설명 삽입

2.2 특징 : 간단한 삽입 정렬

간단한 삽입 정렬 :
1. 두 개의 루프로 인해 시간 복잡도는 O (n ^ 2),
2. 공간 복잡도는 O (1), 하나의 임시 감시자,
3. 인접한 움직임 만 지터없이 하나입니다. 안정적인 정렬
4. 시퀀스가 ​​기본적으로 정렬되는 상황에 적합합니다.

셋, 힐 정렬

요약 : 고급 정렬 방법 인 힐 정렬은 단순 삽입 정렬의 업그레이드 버전으로 간주 될 수 있습니다.

3.1 데모 + 실행 결과

#include <iostream>
 
using namespace std;
void shellSort(int r[],int n)
{
    
    
    for (int d=n/2; d>=1; d=d/2)
    {
    
    
 
        for (int i=d+1; i<=n; i++) //d为增量
        {
    
    
 
            r[0]=r[i];    //0号元素用于暂存  没有意义
            int j=0;
            for ( j=i-d; j>0&&r[0]<r[j]; j=j-d)
                r[j+d]=r[j];           //记录每次移动d个位置,跳跃移动
            r[j+d]=r[0];
        }
    }
}
int main()
{
    
    
    int a[6];
    for (int i=0; i<6; i++)
        cin>>a[i];
    cout<<endl;
    shellSort(a,6);
    for (int i=1; i<6; i++)
    {
    
    
        cout<<a[i];
        cout<<" ";
    }
 
    cout<<endl;
    return 0;
}

작업 결과 :

여기에 사진 설명 삽입

3.2 특징 : 언덕 정렬

Hill sorting :
1. 시간 복잡도는 O (nlgn) ~ O (n ^ 2)로 많은 반복 실험의 결과,
2. 공간 복잡도는 O (1), 일시적인 센티넬,
3. 지터가 있습니다. 움직임은 불안정한 종류입니다.

넷째, 버블 정렬

요약 : 이해하기 쉬운 거품 정렬, 하위 수준 정렬

4.1 데모 + 실행 결과

#include <iostream>
 
using namespace std;
void bubbleSort(int r[],int n)
{
    
    
    int exchange=n;
    while(exchange!=0)
    {
    
    
 
        int  bound=exchange;
        exchange=0;
        for (int j=1; j<bound; j++)
        {
    
    
            if(r[j]>r[j+1])
            {
    
    
                r[0]=r[j];         //0号元素用于交换暂存
                r[j]=r[j+1];
                r[j+1]=r[0];
                exchange=j;
            }
        }
    }
}
int main()
{
    
    
    int a[6];
    for (int i=0; i<6; i++)
        cin>>a[i];
    cout<<endl;
    bubbleSort(a,6);
    for (int i=1; i<6; i++)
    {
    
    
        cout<<a[i];
        cout<<" ";
    }
 
    cout<<endl;
    return 0;
}

작업 결과 :

여기에 사진 설명 삽입

4.2 특징 : 버블 정렬

버블 정렬 :
1. 두 개의 루프로 인해 시간 복잡도는 O (n ^ 2),
2. 공간 복잡도는 O (1), 임시 감시자 하나,
3. 인접한 움직임 만 있고 지터는 없습니다. 안정적인 종류.

다섯, 빠른 정렬 (인터뷰 초점)

요약 : 고급 정렬 인 빠른 정렬은 업그레이드 된 버전의 버블 정렬로 볼 수 있습니다.

5.1 데모 + 실행 결과

#include <iostream>
 
using namespace std;
int Partition(int r[],int first,int _end)
{
    
    
 
    int i=first;int j=_end;
    while(i<j)
    {
    
    
 
        while(i<j && r[i]<=r[j])  j--;
        if(i<j)
        {
    
    
 
            int temp=r[i];
            r[i]=r[j];
            r[j]=temp;
            i++;
        }
        while(i<j && r[i]<=r[j]) i++;
        if(i<j)
        {
    
    
 
            int temp=r[i];
            r[i]=r[j];
            r[j]=temp;
            j--;
        }
    }
    return i;
}
void QuickSort(int r[],int first,int _end)
{
    
    
    if(first<_end)
    {
    
    
        int pivot=Partition(r,first,_end);
        QuickSort(r,first,pivot-1);
        QuickSort(r,pivot+1,_end);
    }
}
int main()
{
    
    
    int a[6];
    for (int i=0; i<6; i++)
        cin>>a[i];
    cout<<endl;
    QuickSort(a,0,5);
    for (int i=0; i<6; i++)
    {
    
    
        cout<<a[i];
        cout<<" ";
    }
 
    cout<<endl;
    return 0;
}

작업 결과 :

여기에 사진 설명 삽입

5.2 기능 : 빠른 정렬

빠른 정렬 :
1. 시간 복잡도는 O (nlgn),
2. 공간 복잡도는 교환 변수 인 O (1) (교환 중에 덧셈과 뺄셈을 합리적으로 사용하면이 변수를 생략 할 수 있음)
3. 지터가 있습니다 . 안정적인 순위;

여섯, 간단한 선택 정렬

요약 : 간단한 선택 정렬, 저수준 정렬 방법, 이해하기 쉬움

6.1 데모 + 실행 결과

#include <iostream>
 
using namespace std;
void selectSort(int r[],int n)
{
    
    
    for (int i=1; i<n; i++)
    {
    
    
 
        int index=i;
        int j=0;
        for (j=i+1; j<=n; j++)
        {
    
    
            if(r[j]<r[index])
            {
    
    
                r[0]=r[j];           //0号元素用于暂存玩车个交换
                //  其实可以不用这样,使用加减法可以不需要暂存元素,这里方便读者理解,用简单的方式
                r[j]=r[index];
                r[index]=r[0];
            }
        }
        if(index!=i)
        {
    
    
 
            r[0]=r[i];
            r[i]=r[index];
            r[index]=r[0];
        }
    }
}
int main()
{
    
    
    int a[6];
    for (int i=0; i<6; i++)
        cin>>a[i];
    cout<<endl;
    selectSort(a,6);
    for (int i=1; i<6; i++)
    {
    
    
        cout<<a[i];
        cout<<" ";
    }
 
    cout<<endl;
    return 0;
}

작업 결과 :

여기에 사진 설명 삽입

6.2 기능 : 간단한 선택 및 정렬

간단한 선택 정렬 :
1. 두 개의 루프로 인해 시간 복잡도는 O (n ^ 2),
2. 공간 복잡도는 O (1)이며, 교환을 실현하기 위해 임시 요소가 사용됩니다 (필요하지 않고 두 개의 숫자를 추가 할 수 있음). 뺄셈은 두 숫자의 교환을 실현합니다 .3.
불안정한 정렬 인 요소 바운스가 있습니다 .4.
최적 및 최악의 평균 시간 복잡도가 O (n ^ 2)이기 때문에 적용에 대한 선호도가 없습니다.

일곱, 힙 정렬

요약 : 고급 정렬 방법 인 힙 정렬은 단순 선택 정렬의 업그레이드 된 버전으로 볼 수 있습니다.

7.1 데모 + 실행 결과

#include <iostream>
 
using namespace std;
void shift(int r[],int k,int m)
{
    
    
 
    int  i=k,j=2*i;   // i 为某个结点  2*i为该结点的左孩子
    while(j<=m)         //  其左孩子没到结束  说明该结点还是非叶子结点,因为叶子结点是没有左孩子的
    {
    
    
 
        if(j<m && r[j]<r[j+1]  )  j++;  //j和j+1  比较左右孩子,j指向较大者
        if(r[i]>r[j])  break;    //当根结点大于左右孩子中较大者,跳出本次循环
        else                //否则,交换根节点和左右孩子较大者
        {
    
    
            r[0]=r[j];   //0号元素用于交换暂存
            r[j]=r[i];
            r[i]=r[0];
            i=j;
            j=2*i;
        }
    }
}
 
void heapSort(int r[],int n)
{
    
    
    for (int i=n/2; i>=1; i--)
        shift(r,i,n);
    for (int i=1; i<n; i++)
    {
    
    
        r[0]=r[1];    //0号元素用于交换暂存
        r[1]=r[n-i+1];
        r[n-i+1]=r[0];
        shift(r,1,n-i);
    }
}
int main()
{
    
    
    int a[6];
    for (int i=0; i<6; i++)
        cin>>a[i];
    cout<<endl;
    heapSort(a,6);
    for (int i=1; i<6; i++)
    {
    
    
        cout<<a[i];
        cout<<" ";
    }
 
    cout<<endl;
    return 0;
}

작업 결과 :

여기에 사진 설명 삽입

7.2 기능 : 힙 정렬

힙 정렬 :
1. 두 사이클로 인해 시간 복잡도는 O (nlgn),
2. 공간 복잡도는 O (1), 임시 센티넬,
3. 불안정한 정렬 인 지터가 있습니다
. 가장 작은 처음 몇 개의 요소와 가장 큰 처음 몇 개의 요소를 선택하는 데 적합합니다.

8. 인터뷰 치트 시트 (분류 알고리즘의 원리 + 분류 알고리즘의 특성)

데이터 구조에는 연결 목록 (스택 및 큐 포함), 이진 트리, 그래프, 검색 및
정렬의 5 개의 테스트 포인트 만 있습니다. 세 가지 정렬 테스트 포인트 : 모든 정렬 알고리즘 비교 + 각 정렬 알고리즘의 원리 + 각 정렬 알고리즘의 특성

각 정렬 알고리즘의 특성을 먼저 나열하고 정렬 알고리즘의 원리는 나중에 설명합니다.

간단한 삽입 정렬 :
1. 두 개의 루프로 인해 시간 복잡도는 O (n ^ 2),
2. 공간 복잡도는 O (1), 하나의 임시 센티넬,
3. 인접한 움직임 만 지터없이 하나입니다. 안정적인 정렬
4. 시퀀스가 ​​기본적으로 정렬되는 상황에 적합합니다.
Hill sorting :
1. 시간 복잡도는 O (nlgn) ~ O (n ^ 2)로 많은 반복 실험의 결과
2. 공간 복잡도는 O (1), 일시적인 감시,
3. 지터가 있습니다. 움직임은 불안정한 종류입니다.

버블 정렬 :
1. 두 개의 루프로 인해 시간 복잡도는 O (n ^ 2),
2. 공간 복잡도는 O (1), 임시 감시자 하나,
3. 인접한 움직임 만 있고 지터는 없습니다. 안정적인 종류.
빠른 정렬 :
1. 시간 복잡도는 O (nlgn),
2. 공간 복잡도는 교환 변수 인 O (1) (교환 중에 덧셈과 뺄셈을 합리적으로 사용하면이 변수를 생략 할 수 있음)
3. 지터가 있습니다 . 안정적인 순위;

간단한 선택 정렬 :
1. 두 개의 루프로 인해 시간 복잡도는 O (n ^ 2),
2. 공간 복잡도는 O (1)이며, 교환을 실현하기 위해 임시 요소가 사용됩니다 (필요하지 않고 두 개의 숫자를 추가 할 수 있음). 뺄셈은 두 숫자의 교환)를 실현,
3. 불안정한 일종의 요소 바운스가있다;
4. 최고와 최악 평균 시간 복잡도는 (N ^ 2) O 있기 때문에 응용 프로그램에 대한 선호가 없다
힙 종류 :
1 , 두 사이클로 인해 시간 복잡도는 O (nlgn),
2. 공간 복잡도는 O (1), 임시 센티넬
3. 불안정한 정렬 인 지터가 있음
4. 선택에 적합 가장 작은 처음 몇 개의 요소와 가장 큰 처음 몇 개의 요소

아홉, 요약

6 가지 정렬 알고리즘 (단순 삽입 정렬, 언덕 정렬, 버블 정렬, 빠른 정렬, 단순 선택 정렬, 힙 정렬)이 완료되었습니다.

매일 코딩하고 매일 진행하세요! ! !

추천

출처blog.csdn.net/qq_36963950/article/details/108953996