排序演算法整理 c語言

2021-08-20 19:34:28 字數 2873 閱讀 5781

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...