用C語言實現常用排序演算法
阿新 • • 發佈:2019-02-12
用C語言總結一下常用排序演算法,雖然大多數語言裡已經提供了排序演算法,比如C函式庫中提供了qsort排序函式(內部為快速排序實現),但理解排序演算法的思想的意義遠遠超過了實用的價值。這裡我總結了常用的排序演算法,並用C語言實現。這些演算法的書寫順序也有一定的關聯,比如希爾排序是對插入演算法的改進,快速排序是對氣泡排序的改進,快速排序和歸併排序都用遞迴實現。
注:每種方法的實現儘量提供了相同的形參列表。這裡並沒用涉及堆排序,箱排序等演算法的實現。
插入排序
演算法概要:插入排序依據遍歷到第N個元素的時候前面的N-1個元素已經是排序好的,那麼就查詢前面的N-1個元素把這第N個元素放在合適的位置,如此下去直到遍歷完序列的元素為止。
- void insertSort(int array[], int length)
- {
- int key;
- for(int i=1; i<length; i++)
- {
- key = array[i];
- for(int j=i-1; j>=0 && array[j] > key; j--)
- {
- array[j+1] = array[j];
- }
- array[j+1] = key;
- }
- }
希爾排序
演算法概要:shell排序是對插入排序的一個改裝,它每次排序排序根據一個增量獲取一個序列,對這這個子序列進行插入排序,然後不斷的縮小增量擴大子序列的元素數量,直到增量為1的時候子序列就和原先的待排列序列一樣了,此時只需要做少量的比較和移動就可以完成對序列的排序了。
Code:- void shellSort(int array[], int length)
- {
- int key;
- int increment;
- for(increment = length/2; increment>0; increment /= 2)
- {
- for(int i=increment; i<length; i++)
- {
- key = array[i];
- for(int j = i-increment; j>=0 && array[j] > key; j -= increment)
- {
- array[j+increment] = array[j];
- }
- array[j+increment]=key;
- }
- }
- }
氣泡排序
演算法概要:氣泡排序是經過n-1趟子排序完成的,第i趟子排序從第1個數至第n-i個數,若第i個數比後一個數大(則升序,小則降序)則交換兩數。
Code:- void bubbleSort(int array[], int length)
- {
- int flag = 0;
- for(int i=0; i<length-1; i++)
- {
- for(int j=0; j<length-1-i; j++)
- {
- if(array[j]>array[j+1])
- {
- flag = 1;
- array[j] = array[j] + array[j+1];
- array[j+1] = array[j] - array[j+1];
- array[j] = array[j] - array[j+1];
- }
- }
- if(flag == 0) break;
- }
- }
快速排序
快速排序(Quicksort)是對氣泡排序的一種改進。通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。
Code:- int Sort(int array[], int first, int last)
- {
- int pivot = array[first];
- int temp;
- if(last-first <=0) return -1;
- while(first != last)
- {
- while(array[last] >= pivot && last != first) last--;
- temp = array[first];
- array[first] = array[last];
- array[last] = temp;
- while(array[first] <= pivot && last != first) first++;
- temp = array[first];
- array[first] = array[last];
- array[last] = temp;
- }
- return last;
- }
- void quickSort(int array[], int length)
- {
- int temp = Sort(array, 0, length-1);
- if(temp == -1 ) return;
- quickSort(array,temp+1);
- quickSort(&array[temp+1],length-temp-1);
- }
歸併排序
演算法概要:歸併排序法是將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然後再把有序子序列合併為整體有序序列。
Code:- void Merge(int A[],int low,int mid,int high)
- {
- int i,j,k;
- int *P = newint[mid-low+1],*Q = newint[high-mid];
- for (i =0;i < mid - low +1;++i) P[i] = A[i+low];
- for (i = 0; i < high - mid;++i) Q[i] = A[mid+1+i];
- i = j = 0,k = low;
- while ((i <= mid-low) && (j <= high-mid-1))
- {
- if (P[i] <= Q[j]) A[k++] = P[i++];
- else A[k++]= Q[j++];
- }
- if (i > mid - low) { for (;j <= high-mid-1;++j) A[k++] = Q[j]; }
- else
- { for (; i <= mid - low;++i) A[k++] = P[i]; }
- delete [] P;
- delete [] Q;
- }
- void mergeSort(int A[],int left,int right)
- {
- if (left < right)
- {
- int i = (left + right) / 2;
- MergeSort(A,left,i);
- MergeSort(A,i+1,right);
- Merge(A,left,i,right);
- }
- }