溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

c++ 6種排序算法 源代碼

發(fā)布時(shí)間:2020-06-26 12:15:42 來(lái)源:網(wǎng)絡(luò) 閱讀:1350 作者:忘記江南 欄目:編程語(yǔ)言
// sort.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
//

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

using namespace std;
template <typename T>
void print(T* &arr,int len) {
    for (int i=0;i<len;i++)
    {
        cout<<*(arr+i)<<' ';
    }
    cout<<endl;
}

//簡(jiǎn)單選擇排序
/*
1.i=[0,len-1),j=[i+1,len-1]數(shù)組第i元素值與j元素值比較,大于交換i與j的元素值
2.j+=1 重復(fù)第一步直到 j == len
3.i+=1 重復(fù)第一步 直到 i == len - 1
*/

template <typename T>
void select_sort(T* &array,int len){
    if (NULL == array)
    {
        cout<<"#ERROR  "<<__FILE__<<"  Line:"<<__LINE__<<" null point error"<<endl;
        return;
    }
    for (int i=0; i<len-1; i++)
        for (int j=i+1;j<len;j++)
            if (array[i] > array[j])
                swap(array[i],array[j]);
}

//冒泡排序
/*
1.BUBBLE相鄰2個(gè)元素比較,大則交換
  每一次使得最大的值到最上面
*/
template <typename T>
void bubble_sort(T* &array,int len){
    if (NULL == array)
    {
        cout<<"#ERROR  "<<__FILE__<<"  Line:"<<__LINE__<<" null point error"<<endl;
        return;
    }
    bool flag;
    for (int i=0; i<len-1; i++)
    {
        flag = true;
        for (int j=0;j<len-i-1;j++)
            if (array[j] > array[j+1])
            {
                flag = false;
                swap(array[j],array[j+1]);
            }
        if (flag) break;
    }
}

//插入排序
/*
1.i屬于[1,len)從i位置往前判斷j屬于[0,i)
 則后一個(gè)元素與前一個(gè)相比小于則替換,大于等于退出第一個(gè)循環(huán)
*/
template <typename T>
void insert_sort(T* &array,int len){
    if (NULL == array)
    {
        cout<<"#ERROR  "<<__FILE__<<"  Line:"<<__LINE__<<" null point error"<<endl;
        return;
    }
    for (int i=1; i<len; i++)
    {
        for (int j=i;j;j--)
        {
            if (array[j] >= array[j-1])
                break;
            swap(array[j],array[j-1]);
        }
    }
}

//歸并排序
/*
用到二分思想將數(shù)據(jù)遞歸成左右2邊得到鏈表A,B
1.鏈表A,B用鏈表歸并來(lái)得到新的有序鏈表
*/
template <typename T>
void merge(T* &array,int left,int mid,int right,T* temp){
    int i = left;
    int j = mid+1;
    int k = 0;

    while (i<=mid && j<=right)
    {
        if (array[i] > array[j])
            temp[k++] = array[j++];
        else
            temp[k++] = array[i++];
    }
    //追加最后
    while (i <= mid)
        temp[k++] = array[i++];
    while (j<=right)
        temp[k++] = array[j++];
    //臨時(shí)變量copy到元素組中
    k = 0;
    while(left<=right)//沒(méi)注意寫(xiě)成k<=right 調(diào)試了半天。 數(shù)據(jù)變成大數(shù)考慮是否賦值越界
        array[left++] = temp[k++];  
}
template <typename T>
void merger_sort(T* &array,int left,int right,T* temp){
    if (left < right)
    {
        int mid = (left + right)/2;
        merger_sort<T>(array,left,mid,temp);//排序左邊子序列
        merger_sort<T>(array,mid+1,right,temp);//排序右邊子序列
        merge<T>(array,left,mid,right,temp);//左右2邊歸并
    }
}
template <typename T>
void merger_sort(T* &array,int len){
    if (NULL == array)
    {
        cout<<"#ERROR  "<<__FILE__<<"  Line:"<<__LINE__<<" null point error"<<endl;
        return;
    }
    T* temp = new T[len];
    merger_sort<T>(array,0,len-1,temp);
    if (NULL != temp)
    {
        delete[] temp;
        temp = NULL;
    }
}
//快排
/*
(一)挖坑填坑
1.以第一個(gè)元素為基準(zhǔn)X 初始值前綴i = left 后綴j = right
2.后綴從后往前查找j元素值 < X;i處 賦值 j元素值
3.前綴從前往后查找i元素值 > X;j處 賦值 i元素值
重復(fù)第2,3步
(二)分治
1.左邊[left,i)執(zhí)行(一)
2.右邊(i,right]執(zhí)行(一)
遞歸執(zhí)行1,2
*/
template <typename T>
int dig_fil(T* &array,int left,int right){
    T X = array[left];
    int i = left;
    int j = right;
    while (i<j)
    {
        while(j>i && array[j] >= X)j--; 
        if (j>i)//只有滿足后綴大于前綴才能賦值 不然會(huì)數(shù)組越界
        {
            array[i] = array[j];
            i++;
        }
        while(i<j && array[i] < X) i++;
        if (i<j)
        {
            array[j] = array[i];
            j--;
        }
    }
    array[i] = X;
    return i;
}

template <typename T>
void quick_sort(T* &array,int left,int right){
    if (left < right)
    {
        int mid = dig_fil<T>(array,left,right);
        quick_sort(array,left,mid-1);
        quick_sort(array,mid+1,right);
    }

}
template <typename T>
void quick_sort(T* &array,int len){
    if (NULL == array)
    {
        cout<<"#ERROR  "<<__FILE__<<"  Line:"<<__LINE__<<" null point error"<<endl;
        return;
    }
    quick_sort(array,0,len-1);
}
//堆排序
/*
堆排序采用完全二叉樹(shù) 
1.從所有非葉節(jié)點(diǎn)中構(gòu)建最大堆 
2.交換堆頂與最后一個(gè)元素
3.對(duì)所有[0,len-1)執(zhí)行第 1,2步
*/
template <typename T>
void adjust(T* &array,int sign,int len){
    T temp = array[sign];
    //每一次循環(huán)都更新該父節(jié)點(diǎn)為根的完全二叉樹(shù)最大堆
    for (int i = sign * 2 + 1; i < len; i = i * 2 + 1){
        if (i + 1 < len && array[i + 1] > array[i])
            i++;
        //判斷子節(jié)點(diǎn) 大于父節(jié)點(diǎn) 
        if (array[i] > temp){
            array[sign] = array[i];
            sign = i;
        }
    }
    array[sign] = temp;
}

template<typename T>
void heap_sort(T* &array,int len){
    //1.從所有非葉子節(jié)點(diǎn) 構(gòu)建初始大頂堆
    for (int i = len / 2 - 1; i >= 0; i--){
        adjust(array, i, len);
    }
    //
    for (int i = len - 1; i; i--){
        //2.交換最大堆 和 相對(duì)的最后一個(gè)元素
        swap(array[i],array[0]);
        //3.重新調(diào)整堆結(jié)構(gòu)
        adjust(array, 0, i);
    }
}
int _tmain(int argc, _TCHAR* argv[])
{
    int a[] = {1,5,4,9,0,2,3,6,8,7};
    int* pa = a;
    //select_sort<int>(pa,10);
    //bubble_sort<int>(pa,10);
    //insert_sort<int>(pa,10);
    //merger_sort<int>(pa,10);
    //quick_sort<int>(pa,10);
    //heap_sort(pa,10);
    print<int>(pa,10);
    getchar();
    return 0;
}
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI