1. 程式人生 > >排序演算法原理以及實現

排序演算法原理以及實現

1.氣泡排序演算法

2.插入排序演算法

/*
 * 1.第一個元素開始,假設第一個元素已排序
 * 2.取下一個元素temp_val,在已排序的區間從後往前掃描,如果大於temp_val,則往後移
 * 3.直到小於的時候,將其後一位置為temp_val即可
 * 4.重複n-1次2、3步驟
 */
//三個引數目的是為了,排序某個區間
void insertion_sort(vector<int> array, int first,int last)
{
    int j; 
    int temp_val;    //取出來的未排序排序數
    for(int i = first+1; i<=last; i++)    //未排序數遍歷
    {
        temp_val = array[i];        
        j = i-1;                          //已排序數的最後一個
        while(j>=0 && array[j]>temp_val)  //已排序未越界且未排序數大於temp_val
        {
            array[j+1] = array[i];        //後移
            j--;                          //往前掃描
        }
        array[j+1] = temp_val;            //到已排序小於temp_val,則下一位為tem_val的位置
    }
}

二分插入排序

/*
 * 1.第一個元素開始,假設第一個元素已排序
 * 2.取下一個元素temp_val,在已排序的區間二分查詢,如果mid的值大於等於temp_val,則right=mid,反之left = mid
 * 3.直到right<left的時候,確定mid位置,插入mid,之後後移並插入
 */
//三個引數目的是為了,排序某個區間
void insertion_sort(vector<int> array, int first,int last)
{
    int left,mid,right; 
    int temp_val;    //取出來的未排序排序數
    for(int i = first+1; i<=last; i++)    //未排序數遍歷
    {
        temp_val = array[i];        
        left = 0;                          //已排序數的二分左端
        right = 0;                          //已排序數的二分右端

        //二分查詢精髓,確定要插入位置,最後位置在left(mid)上
        while(left<=right)  //已排序未越界且未排序數大於temp_val
        {
            mid = (left + right)/2;
            if(array[mid]>=temp_val)
                right = mid-1;
            else
                left = mid+1;
        }
        

        //後移,為temp_val騰出空間
        for(int j = i-1; j>left; j--)
            array[j+1] = array[j];
        array[left] = temp_val;            //到已排序小於temp_val,則下一位為tem_val的位置
    }
}

3.希爾排序

4.選擇排序

5.氣泡排序

6.雞尾酒排序/雙向冒泡

7.快速排序

void quick_sort(vector<int> array, int left, int right)  
{
    int i,j,temp_val;
    if(left > right)
        return ;
    
    temp_val = array[0];    //選取基準
    i = left;    //左向右掃描
    j = right;    //右向左掃描
    while(i!=j)
    {    
        //最開始從右向左掃描,必須先從右開始
        while((array[j] >= temp_val) && i <j)    //找到第一個大於temp_val的值
            j--;
        while((array[i] <= temp_val) && i<j)    //找到第一個小於temp_val的值
            i++;
        if(i<j)    //交換位置
        {
            int temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }
            
    }
    array[left] = a[i];    //將最中間的數值與基準交換位置
    array[i] = temp;


    quick_sort(array, left, i-1);     //對標準值左半部遞迴呼叫本函式  
    quick_sort(array, i+1, right);    //對標準值右半部遞迴呼叫本函式  
  }  
}  

8.堆排序