1.選擇排序
選擇排序就是找到它的最小元素,然後和第乙個元素交換,將最小元素放到它在有序表中的最終位置上。然後從第二個元素開始掃瞄列表,找到後面n-1個元素中的最小元素,再和第二個元素比較,這樣到最後就已經排完序了。其時間複雜度是:o(n^2).
附程式:
//選擇排序,2018.06.17
//輸入亂序的陣列nums
//拍好序的陣列 nums
void selectionsort(int *nums,int n)
a = nums[i];
nums[i] = nums[min];
nums[min] = a;
} 2. 氣泡排序
氣泡排序比較陣列中的相鄰元素,如果他們是逆序的話,就交換他們的位置。重複多次以後,最終最大的元素沉到列表的最後乙個位置。第二遍就把第二大的元素沉了下去。氣泡排序和選擇排序都是蠻力法,其複雜度為o(n^2);
//氣泡排序,2018.06.17
//輸入亂序的陣列nums
//拍好序的陣列
void bubblesort(int *nums,int n)
}3.插入排序:冒泡和選擇排序均是蠻力法的解決。為了降低程式的複雜度,採用減治法的思想,形成了插入排序。
直接插入排序即是在要排序的陣列中,假設前n-1(n>=2)個數已經是排好序的,現在要把第n個數插入到前n個已經排好序的陣列中,使得這n個數也變成有序的,如此反覆迴圈,使得要排序的陣列中的最後乙個元素也排好序,
我們可以先假設第乙個數是排好序的,然後第二個數和第乙個數進行比較,如果第二個數比第乙個數大,那麼說明前兩個數排好序,無需做調整,如果第二個數比第乙個數小,那麼就把第乙個數向後移,將第二個數放在第乙個數的位置上,抽象出來就是用a[i]和a[i-1]進行比較,如果a[i]>a[i-1],那麼就說明前i個數是已經排好序的,如果a[i]
附**:
//插入排序,20180617
//輸入亂序的陣列nums
//輸出公升序的陣列
void insertsort(int *nums,int n)
nums[j+1] = v;} }
注意:插入排序最好的情況是o(n),即都是公升序排列,最差的情況是o(n^2).
4.合併排序.
採用了分治思想,對於乙個需要排序的陣列nums,合併排序把它一分為2::nums[0,...n/2]-1和nums[n/2,...n-1],並對每個子陣列遞迴排序,然後把這兩個拍好序的陣列合併為乙個有序陣列。
//合併排序。20180617
//遞迴呼叫mergesort來對陣列排序
//輸入乙個可排序陣列
//輸出:非降序排列的陣列
//該函式功能是將兩個有序陣列合併成乙個陣列,通過設定乙個臨時陣列,將兩個陣列的值進行比較,按照大小數學放到臨時陣列中,最後將臨時陣列的值會給大的陣列。這樣完成了兩個陣列的排序
void merge(int *nums, int start, int mid, int end)
else
} while(start>mid&&last<=end)
while(start<=mid&&last>end)
for(i=0;first<=end;i++,first++)
} //該陣列的功能是遞迴將問題分解為乙個個子問題,遞迴呼叫。
void mergesort(int *nums,int start,int end)
}合併排序時間複雜度為o(nlogn).
5.快速排序
快速排序是另一種基於分治技術的重要排序演算法。不像合併排序是按照元素在陣列中的位置對他們進行劃分,快速排序是按照元素的值對它們進行劃分。
附程式:
void swap(int *a, int *b)
/************************************
*函式名:quicksort
*作用:快速排序演算法
*引數:
*返回值:無
************************************/
void quicksort(int *array, int maxlen, int begin, int end)
else
} /* 跳出while迴圈後,i = j。
* 此時陣列被分割成兩個部分 --> array[begin+1] ~ array[i-1] < array[begin]
* --> array[i+1] ~ array[end] > array[begin]
* 這個時候將陣列array分成兩個部分,再將array[i]與array[begin]進行比較,決定array[i]的位置。
* 最後將array[i]與array[begin]交換,進行兩個分割部分的排序!以此類推,直到最後i = j不滿足條件就退出!
*/
if(array[i] >= array[begin]) // 這裡必須要取等「>=」,否則陣列元素由相同的值時,會出現錯誤!
swap(&array[begin], &array[i]); // 交換array[i]與array[begin]
quicksort(array, maxlen, begin, i);
quicksort(array, maxlen, j, end);
} 6.計數排序
比較計數排序是針對帶排序列表中的每乙個元素,算出列表中小於該元素的元素個數,並將結果記錄在一張表上。這些個數指出了該元素在有序列表中的位置。
void comparisoncountingsort(int *nums,int n)
for(i=0;i
for(i=0;i
}
C 排序演算法整理
from 菜鳥程式設計 參考 十大經典排序演算法 include using namespace std template typename t 整數或浮點數皆可使用,若要使用類 class 或結構體 struct 時必須過載大於 運算子 一次冒泡 for int i 0 i len 1 i 氣泡排...
C語言演算法整理
1.求素數和判斷素數 方法一 篩選法求素數 include void main for i 0 i 100 i if a i 1 printf d i 方法二 根式求素數 時間複雜度小 include include int main if j sqrt i return 0 判斷素數 includ...
排序 排序演算法整理
經常零零散散的用到排序演算法,將幾類常見的總結下來 時間複雜度o n 2 空間複雜度o 1 穩定排序 param arr public static void insersort int arr else arr j 1 tmp 氣泡排序 時間複雜度 o n 2 空間複雜度o 1 穩定排序 para...