1. 程式人生 > >C++排序算法

C++排序算法

str heapsort art 叠代 數組 std star else 思想

參考http://www.cnblogs.com/zyb428/p/5673738.html#commentform

修改了部分代碼的錯誤。

一、直接插入排序

  大循環取i=1,到n,依次++i;小循環取j=i,到0,依次--j;循環語句:使用temp依次比較從小到大。

void InsertSort(int arr[],int n)
{
    for (int i = 1; i < n; ++i)
    {
        for (int j = i; j > 0; --j)
        {
            if (arr[j] <arr[j - 1])
            {
                
int temp = arr[j]; //swap(arr[j],arr[j-1]); arr[j] = arr[j - 1]; arr[j - 1] = temp; } } } } 

二、冒泡排序

  大循環(i=0;i<n-1;i++)全遍歷;小循環(j=0;j<n-i;j++)對i以外的所有無序元素進行兩兩交換,相當於把最大(最小)那個元素慢慢排到最頂端,這個頂端就是i的有序區,下次j循環就不在排序有序區。

void BubbleSort(int arr[], int
n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } }

  修改:①不用對有序區進行叠代。②初始就是有序的話需要進行判斷。

     ①i不需要<n-1,只要小於有序區就可以,最開始的有序區即為n-1,用last代替,依次--。即i<last,有序區不再進行排序。當有序區lsat=0時退出叠代。

     ②如果初始就排序成功,則不用進行交換,使用一個標記flat,初始化為0,如果叠代一遍完成發現沒有交換操作則flat保持為0,並賦值給last,直接跳出叠代。若進行操作則flat賦值為i,令其無法等於0,防止意外跳出。

void BubbleSort(int arr[], int n)
{
    int i, temp;
    int flat, last = n - 1;
    while (last > 0)
    {
        for (i = flat = 0; i <=last; ++i)
        {
            if (arr[i] < arr[i - 1])
            {
                temp = arr[i];
                arr[i] = arr[i - 1];
                arr[i - 1] = temp;
                flat = i;
            }
        }
        last = flat;
    }
}

三、快速排序

  遞歸的思想,找到中值oncesort(),每次quicksort函數都包含一個找中值函數和兩個quicksort函數(分別為中值左右兩邊)。

  找中值的思想:i在最左邊,j在最右邊,同時滿足i<j和arr[i]<arr[j]時,j慢慢左移,如果arr[i]>arr[j],則交換,同時變為i往右移動。直到不滿足i<j。return i 即為中值位置。

int OnceSort(int arr[], int first, int end)
{
    int i = first; int j = end;
    while (i < j)
    {
        while (i < j&&arr[i] <= arr[j]) 
        {
            j=j-1;
        }
        if (i < j)
        {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;

        }
        while (i < j&&arr[i] <= arr[j]) 
        {
            i=i+1; 
        }
        if (i < j)
        {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;

        }
    }
    return i;
}

void QuickSort(int arr[], int first, int end)
{
    if (first < end)
    {
        int flat = OnceSort(arr, first, end);
        QuickSort(arr, first, flat - 1);
        QuickSort(arr, flat + 1, end);
    }

}

四、堆排序

void Heapify(int arr[], int first, int end)
{
    int father = first;;
    int son = 2 * father + 1;
    while (son < end)
    {
        if (son + 1 < end&&arr[son] < arr[son + 1])
        {
            son = son + 1;
        }
        if (arr[father] > arr[son])
            break;
        else
        {
            int temp = arr[son];
            arr[son] = arr[father];
            arr[father] = temp;
            father = son;
            son = 2 * father + 1;
        }
    }
}

void HeapSort(int arr[], int n)
{
    for (int i = n / 2 - 1; i >= 0; --i)
    {
        Heapify(arr, i, n);
    }
    for (int i = n - 1; i > 0; --i)
    {
        int temp = arr[i];
        arr[i] = arr[0];
        arr[0] = temp;
        Heapify(arr, 0, i);
    }

}

五、歸並排序

void Merge(int arr[], int reg[], int start, int end) {
    if (start >= end)return;
    int len = end - start, mid = (len >> 1) + start;

    int start1 = start, end1 = mid;
    int start2 = mid + 1, end2 = end;

    Merge(arr, reg, start1, end1);
    Merge(arr, reg, start2, end2);


    int k = start;
    
    while (start1 <= end1 && start2 <= end2)
        reg[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];

    
    while (start1 <= end1)
        reg[k++] = arr[start1++];

    
    while (start2 <= end2)
        reg[k++] = arr[start2++];
    
    for (k = start; k <= end; k++)
        arr[k] = reg[k];
}

void MergeSort(int arr[], const int n) {
    int *reg=new int [n];
    Merge(arr, reg, 0, n - 1);
    delete[] reg;
}

主程序:數組的生成和排序顯示

#include "stdafx.h"
#include<Sort.h>
#include<cmath>
#include<iostream>

using namespace std;



int main()
{
//////////************************原始數組創建******************************/////////////////
    int arr[50];

    for (int i = 0; i < 50; i++)
    {
        arr[i]=(rand() % 50 + 1);
    }
    int num = sizeof(arr) / sizeof(int);


//////////*****************************排序*************************/////////////////
    //InsertSort(arr,num);
    //BubbleSort(arr, num);
    //QuickSort(arr, 0, num - 1);
    //HeapSort(arr, num);
    //MergeSort(arr, num);;
//////////********************************顯示**********************/////////////////

    for (int j = 0; j < num; j++)
    {
        cout << arr[j] << " ";

    }


    system("pause");

return 0;
}

C++排序算法