C語言實現幾種常見排序演算法

2021-08-25 08:37:36 字數 2934 閱讀 9536

氣泡排序最好的時間複雜度為 o(n)。

氣泡排序總的平均時間複雜度為 o(n^2)

氣泡排序演算法的原理如下:

1.比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。

2.對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。

3.針對所有的元素重複以上的步驟,除了最後乙個。(比較 n-1 趟,每趟 n-1-i 次)

4.持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

void bubblesort(int arr,int n)

} }}

第一趟比較前兩個數,然後把第二個數按大小插入到有序表中; 

第二趟把第三個資料與前兩個數從後向前掃瞄,把第三個數按大小插入到有序表中;

依次進行下去,進行了(n-1)趟掃瞄以後就完成了整個排序過程。

直接插入排序是由兩層巢狀迴圈組成的。外層迴圈標識並決定待比較的數值。

內層迴圈為待比較數值確定其最終位置。直接插入排序是將待比較的數值與它的前乙個數值進行比較,

所以外層迴圈是從第二個數值開始的。當前一數值比待比較數值大的情況下繼續迴圈比較,

直到找到比待比較數值小的並將待比較數值置入其後一位置,結束該次迴圈。

//方法一

void insertsort_1(int arr,int n)

}}//方法二

//a[0]哨兵位,假設a[1]已為排好序的,開始排序 //列印從arr[1]開始

void insertsort_2(int arr,int n)

arr[low]=arr[0];

} arr[0] = null;

}

希爾排序屬於插入類排序,是將整個有序序列分割成若干小的子串行分別進行插入排序。

排序過程:先取乙個正整數d1=1;div=div/2)//定增量div,並不斷減小

}}}

//快速排序

void qsort(int arr, int low, int high)

int first = low;

int last = high;

int key = arr[first];/*用字表的第乙個記錄作為樞軸*/

while(first < last)

arr[first] = arr[last];/*將比第乙個小的移到低端*/

while(first < last && arr[first] <= key)

arr[last] = arr[first];

/*將比第乙個大的移到高階*/

}arr[first] = key;/*樞軸記錄到位*/

qsort(arr, low, first-1);

qsort(arr, first+1, high);

}

第一次從r[0]~r[n-1]中選取最小值,與r[0]交換,第二次從r[1]~r[n-1]中選取最小值,

與r[1]交換,....,第i次從r[i-1]~r[n-1]中選取最小值,與r[i-1]交換,.....,

總共通過n-1次,得到乙個按排序碼從小到大排列的有序序列。

void selectsort(int arr, int n) }}

}

//堆排序

void swap(int *a, int *b);

void adjustheap(int param1,int j, int innums);

void heapsort(int nums, int innums);

//大根堆進行調整

void adjustheap(int param1, int j, int innums)

else

break;

}//put the value in the final position

innums[param1]=temp;

}//堆排序主要演算法

void heapsort(int nums,int innums)

//2.調整堆結構+交換堆頂元素與末尾元素

for (int j=nums-1;j>0;j--)

}

//歸併排序

void merge(int sourcearr,int temparr, int startindex, int midindex, int endindex)

while(i != midindex+1)

temparr[k++] = sourcearr[i++];

while(j != endindex+1)

temparr[k++] = sourcearr[j++];

for(i=startindex; i<=endindex; i++)

sourcearr[i] = temparr[i];}

//內部使用遞迴

void mergesort(int sourcearr, int temparr, int startindex, int endindex)

}

void main()

; int n = sizeof(arr)/sizeof(int);

//bubblesort(arr,n);

//insertsort_1(arr,n);

//insertsort_2(arr,n);

//binsort(arr,n);

//shellsort(arr,n);

//qsort(arr,0,n);

//selectsort(arr,n);

//heapsort(n, arr);

int brr[8];

mergesort(arr,brr, 0, n-1);

for(int i=0;i

C語言實現幾種常見排序演算法

worker.c created on 2010 7 1 author panfei include void swap int x,int y 插入排序 公升序 void insertsort int arr,int size arr j 1 to insert 選擇排序 降序 void sele...

幾種常見排序演算法的c語言實現

1 冒泡法1 其原理為從a 0 開始,依次將其和後面的元素比較,若a 0 a i 則交換它們,一直比較到a n 同理對a 1 a 2 a n 1 處理,即完成排序。cpp view plain copy void bubble int a,intn 2 冒泡法2 冒泡法還有第二種形式,或者叫沉底法也...

幾種常見排序演算法原理 C語言實現

以下各法均以從小到大排序為例,定義len為陣列array的長度 原理 比較相鄰元素的大小,對於每次迴圈,按排序的規則把最值移向陣列的一端,同時迴圈次數依次減少。c 實現 1.原理 先在未排序的陣列中找出最值,通過交換將其放在陣列第一位,然後再從剩餘的未排序陣列中找到另乙個最值,將其放在已排序陣列的末...