排序算法總結(C++版)

總結下學過的排序算法,方便之後用到。算法

1.插入排序——將一個記錄插入到已排序好的有序表中,從而獲得一個新,記錄數增1的有序表。數組

void insertSort(int a[],int len)
{
    for(int i = 1;i < len;i ++)
    {
        int j = i;
        int x = a[j];                    //要插入的數
        while(j > 0 && x < a[j - 1])     //將大的數推上去,空出個位置
        {
            a[j] = a[j - 1];
            j--;
        }
        a[j] = x;                          //插入
    }
}

2.冒泡排序——不斷地比較相鄰2個數的大小,大的就推到後面,最後把最大值推到了最後,依次類推。函數

void swap(int &a,int &b)
{
    int tmp = a;
    a = b;
    b = tmp;
}

void bubbleSort(int a[],int len)
{
    for(int i = len - 1;i > 0;i --)    
        for(int j = 0;j < i;j ++)
            if(a[j] > a[j + 1])
                swap(a[j],a[j + 1]);
}

3.選擇排序——第一次選出數組中最小的數與第一個數交換位置,第二次選出第二小的與第二個數交換位置,以此類推。ui

//swap函數見上。
void selectSort(int a[],int len)
{
    for(int i = 0;i < len - 1;i ++)
    {
        int min = a[i];
        int minPos = i;
        for(int j = i + 1;j < len;j ++)
        {
            if(a[j] < min)
            {
                min = a[j];
                minPos = j;
            }
        }
        if(minPos != i)
            swap(a[i],a[minPos]);
    }
}

4.歸併排序——將一個序列分紅2個長度相等的子序列,分別排序,而後再將它們合併成一個有序的序列。(合併的過程比較麻煩,這裏利用一個輔助數組來將排好序的子序列先複製過去,而後再歸併回原數組)spa

void mergeSortHelp(int a[],int tmp[],int left,int right)
{
    if(left == right)
        return;
    int mid = (left + right) / 2;
    mergeSortHelp(a,tmp,left,mid);
    mergeSortHelp(a,tmp,mid + 1,right);
    for(int i = left;i <= right;i ++)
        tmp[i] = a[i];
    int i = left;
    int j = mid + 1;
    int k = left;
    while(k <= right)
    {
        if(j > right)
            a[k++] = tmp[i++];
        else if(i > mid)
            a[k++] = tmp[j++];
        else if(tmp[i] < tmp[j]) 
            a[k++] = tmp[i++];
        else a[k++] = tmp[j++];
    }
}

void mergeSort(int a[],int len)
{
    int *tmp = new int[len];
    mergeSortHelp(a,tmp,0,len - 1);
    delete []tmp;
}

5.快速排序——選擇數組中的一個數做爲軸值(這裏選擇第一個數),將小於軸值的數放到左邊,大的放到右邊,軸值放中間,這樣只須要各自遞歸快排左右兩邊數組,完成排序。code

//swap函數見上上上
int
partition(int a[],int left,int right) { int pivotPos = left; //記錄軸值位置 int pivot = a[left]; //取最左邊的值做爲軸值 left ++; //避開軸值 while(left < right) //從左右兩邊各自掃描數組,左邊遇到比軸值大的就停下,右邊遇到比軸值小的就停下,交換。繼續。。。 { while(a[left] < pivot && left < right) left++; while(a[right] > pivot && left < right) right--; swap(a[left],a[right]); } if(a[right] < a[pivotPos]) { swap(a[right],a[pivotPos]); return right; }else { swap(a[right - 1],a[pivotPos]); return right - 1; } } void quickSortHelp(int a[],int left,int right) { if(left >= right) return; int k = partition(a,left,right); //經過partition將數組按比軸值大小分別放到軸值左右兩邊,返回最後軸值的位置k。 quickSortHelp(a,left,k - 1); quickSortHelp(a,k + 1,right); }

void quickSort(int a[],int len)
{
  quickSortHelp(a,0,len - 1);
}blog

6.堆排序(夜深下次再寫)排序

相關文章
相關標籤/搜索