バブルソート、クイックソート、二分挿入ソートc++実装

2164 ワード

まずin-place交換の方法を差し上げます
//in-place swap
void swap_int(int& a, int& b)
{
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
}

バブルソート実装
/*
 *          
 *         ,           
 *   :                
 *                      ,        
 */
void BubbleSort(int a[], int len)
{
    bool swaped = false;
    for (int i = 0; i < len; ++i)
    {
        for (int j = 1; j < len - i; ++j)
        {
            if (a[j - 1] > a[j])
            {
                swap_int(a[j - 1], a[j]);
                swaped = true;
            }
        }

        if (!swaped) break;
    }
}

高速ソートの実装
/*
 *          
 *            ,         ,         ,     
 */
void QuickSort(int s[], int left, int right)
{
    if (left < right)
    {
        int i = left, j = right, x = s[left];
        while (i < j)
        {
            while (i < j && s[j] >= x) //           x    
                j--;
            if (i < j)
                s[i++] = s[j];
            print_arr(s, SIZE);
            while (i < j && s[i]< x) //             x    
                i++;
            if (i < j)
                s[j--] = s[i];
            print_arr(s, SIZE);
        }
        s[i] = x;
        QuickSort(s, left, i - 1); //       
        QuickSort(s, i + 1, right);
    }
}

二分挿入ソート
/*
 *             
 *                              ,            
 */
int SearchBinary(int a[], int value, int left_index, int right_index)
{
    if (right_index <= left_index) 
        return a[left_index] < value ? left_index+1:left_index;

    int mid = (right_index + left_index) / 2;
    if (value == a[mid]) 
        return mid + 1;

    if (value > a[mid]) 
        return SearchBinary(a, value, mid + 1, right_index);

    return SearchBinary(a, value, left_index, mid - 1);
}

void InsertSort(int a[], int len)
{
    for (int i = 1; iindex; --j)
            {
                a[j] = a[j - 1];
            }
            a[index] = tmp;
        }
    }
}