C++排序演算法

來源:互聯網
上載者:User

標籤: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++排序演算法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.