1、冒泡排序
#include "stdio.h"void bubble_sort(int arr[],int n){ int i,j,temp; for(i=0; i<n-1; i++) { for(j=0; j<n-i-1; j++) { if(arr[j]>arr[j+1]) { temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } return ;}
對於如上的冒泡排序,如果在第一層迴圈完成之前,數組中所有的資料已經完成了排序,這時就需要進行改進,改進的具體代碼如下:
#include "stdio.h"void bubble_sort(int arr[],int n){ int i,j,flag,temp; for(i=0; i<n-1; i++) { flag=1; for(j=0; j<n-i-1; j++) { if(arr[j]>arr[j+1]) { temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; flag=0; } if(1==flag) break;// 跳出最近的一層迴圈 } } return ;}
2、選擇排序
依次以每個數為基準,與它後面的數進行比較,並將最小的數與它進行交換。這樣可以保證基準和基準以前的數都為有序數。
#include "stdio.h"void choose_sort(int a[],int n){ int i,j,k,temp; for(i=0; i<n-1; i++) { k=i; for(j=i+1; j<n; j++) { if(a[j]<a[k]) { k=j; } if(k!=i) { temp=a[i]; a[i]=a[k]; a[k]=temp; } } }}
3、快速排序
#include "stdio.h"#define N 6
// 進行基準的劃分int partition(int arr[],int low,int hight){ int key; key=arr[low];// 儲存了最基準的數,所以可以隨便覆蓋 while(low<high) { while(low<high&&arr[high]>=key) high--; if(low<high) arr[low++]=arr[high]; while(low<high&&arr[low]<=key) low++; if(low<high) arr[high--]=arr[low]; } arr[low]=key; return low;}void quick_sort(int arr[],int start,int end){ int pos; if(start<end) { pos=partition(arr,start,end); quick_sort(arr,start,pos-1); quick_sort(arr,pos+1,end);// 遞迴進行排序 } return ;}
4、歸併排序
歸併排序的基本思想是將待排序序列分為兩個部分,依次對分得的兩個部分再次使用歸併排序,之後再對其進行合并。
#include "stdio.h"void merge(int arr[],int low,int mid; int high){ int i,k; int *temp=(int *)malloc((high-low+1)*sizeof(int));// 申請空間 int left_low=low; int left_high=mid; int right_low=mid+1; int right_high=high; // 比較兩個指標所指向的元素 for(k=0; left_low<=left_high&&right_low<=right_high; k++) { if(arr[left_low]<=arr[right_low]) { temp[k]=arr[left_low++]; } else { temp[k]=arr[right_low++]; } } // 如果第一個序列有剩餘,直接複製出來粘到定序序列尾 if(left_low<=left_high) { memcpy(temp+k,arr+left_low,(left_high-left_low+1)*sizeof(int)); for(i=left_low; i<=left_high; i++) { temp[k++]=arr[i]; } } // 如果第二個序列有剩餘,直接複製出來粘到定序序列尾 if(right_low<=right_high) { memcpy(temp+k,arr+right_low,(right_high-right_low+1)*sizeof(int)); for(i=right_low; i<=right_high; i++) { temp[k++]=arr[i]; } } for(i=0; i<high-low+1; i++) arr[low+i]=temp[i]; free(temp); return ;}void merge_sort(int arr[],unsigned int first,unsigned int last){ int mid=0; if(first<last) { mid=(first+last)/2; merge_sort(arr,first,mid); merge_sort(arr,mid+1,last); merge(arr,first,mid,last); }}