7種常見排序演算法的c 實現

2021-08-16 01:07:38 字數 2599 閱讀 3079

今天心血來潮複習了一下基本的排序演算法,實現了一下,就順便發上來咯。。

在**裡做了注釋了-。-

也就不多說了,直接上**吧。。

// order_algorithm.cpp: 定義控制台應用程式的入口點。

//author: netbin

#include "stdafx.h"

#include "iostream"

#include #include #include #include //指定陣列的大小

const int max_size = 50;

using namespace::std;

//插入排序

//時間複雜度o(n^2),空間複雜度o(n),是乙個穩定演算法;

//假定該陣列有有序區和無序區:則不斷地將無序區的第乙個元素取出放置於有序區的正確位置;

//從i的位置開始,從後往前依次比較,如果nums[j]小於nums[i],則交換二者的位置;

//優化:我們可以知道插入排序的前部是有序的,則如果nums[j]>=nums[i],則表明,i之前的所有元素

//都符合這個特性,那麼也就不需要再繼續比較了;

void insert_sort(vector&nums)

else

break;

} }}//希爾排序

//時間複雜度 o(n^1.3),準確地說希爾排序的時間複雜度與增量序列有關

//它是乙個不穩定的演算法:因為可能數處於不同的組別內

//希爾排序是對插入排序的優化

void shell_sort(vector&nums)

//這裡需要注意的是在上面的for迴圈中,最後還會執行一次j-=gap;

//所以這裡的j+gap會等於上面結束時j的值

nums[j + gap] = temp;

} }}//氣泡排序

//時間複雜度: o(n^2),空間複雜度:o(n)

//穩定性:是乙個穩定演算法

void bubble_sort(vector&nums)

} }}//選擇排序:從無序陣列中選出最小(最大)的數,放到亂序陣列的頭部

//優化:同時選出最大和最小

void select_sort(vector&nums)

} int temp = nums[i];

nums[i] = nums[min];

nums[min] = temp; }}

//快速排序

void quick_sort(vector&nums, int b, int e, vector&temp)

//如果當前位置元素的值小於選中的元素,則新增到臨時陣列的左邊

if (nums[i] < nums[m]) else

} //迴圈結束時,temp陣列中lb指向的位置就是在nums陣列中選中元素所在的位置

temp[lb] = nums[m];

//將temp陣列複製到nums陣列中

for (int i = b; i < e; i++)

//遞迴呼叫

quick_sort(nums,b,lb,temp);

quick_sort(nums, lb + 1, e, temp); }}

//歸併排序

//時間複雜度:o(nlogn)

//歸併排序是將元素分割為乙個乙個的小組,然後對每個小組再進行排序,然後再合併陣列,分而治之的思想

//這種排序的方式與希爾排序的基本思想類似

void merge_array(vector&nums, int b, int m, int e, vector&temp)

else

} //如果右邊的已經空了,而左邊沒空,就將左邊陣列的剩餘所有元素全部入陣列

while (lb < m)

temp[tb++] = nums[lb++];

//如果左邊的已經空了,而右邊沒空,就將右邊陣列的剩餘所有元素全部入陣列

while (rb < m)

temp[tb++] = nums[rb++];

//將此次合併存入臨時陣列的元素全部複製到nums陣列中

for (int i = b; i < e; i++)

}void merge_sort(vector&nums, int b, int e, vector&temp)

}//堆排序

//建堆以及調整堆

void max_heapofy(vector&nums, int beg, int end)

else

//如果不需要調整,則結束此次迴圈

break; }}

void heap_sort(vector&nums)

//將堆頂(最大元素)和陣列的最後乙個值交換,然後再調整堆

for (int i = n - 1; i > 0; i--)

}//初始化vector陣列函式

void init_vec(vector&nums)

}//輸出結果,並清空vector

void print_clear(vector&nums)

cout << endl;

nums.clear();

}int main()

常見的7種排序演算法

1 氣泡排序 最簡單的一種排序演算法。先從陣列中找到最大值 或最小值 並放到陣列最左端 或最右端 然後在剩下的數字中找到次大值 或次小值 以此類推,直到陣列有序排列。演算法的時間複雜度為o n 2 氣泡排序 void bubblesort int arr,int length 2 選擇排序 嚴蔚敏版...

php實現7種常見排序

class test public function createdata sectime microtime this gettimelimit firtime,sectime return data 歸併排序開始 public function mergesort data public fun...

七種常見的排序演算法的C 實現

因為幾個演算法使用了遞迴,這裡測試用的陣列大小又比較大,如果使用vs編譯的話,需要調整一下堆疊的大小,否則容易發生stackoverflow的錯誤。如下 include stdafx.h include include include using namespace std define num 5...