码迷,mamicode.com
首页 > 编程语言 > 详细

C++排序算法

时间:2018-09-05 15:05:52      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:and   包含   class   ace   pre   分代   rand   防止   The   

参考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++排序算法

标签:and   包含   class   ace   pre   分代   rand   防止   The   

原文地址:https://www.cnblogs.com/Eumenides/p/9591702.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!