c語言中排序的方法有很多,就面試的可能性和使用的廣度來說下面4種排序方法必須掌握,給出源代碼:
1.冒泡排序:(前兩個直接在main()函數種實現)
/*********************************************** * 函數名稱: 冒泡排序 * 作 者: 程鳳明 * 時 間: 2009-7-20 ************************************************/ #include <stdio.h> #define N 10 main() { int i, j, temp; int a[N]; printf("please input %d numbers:/n",N); for(i = 0; i < N; i++) { scanf("%d",&a[i]); } for (i = 0; i < N-1; i++) //表示要比較N-1趟 { for (j =0; j < N-i-1; j++) //表示每趟比較的次數 { if (a[j] > a[j+1]) { temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } } for(i = 0; i < N; i++) { printf("%-5d",a[i]); } printf("/n"); }
2.選擇排序:
/*********************************************** * 函數名稱: 選擇排序 * 作 者: 程鳳明 * 時 間: 2009-7-20 ************************************************/ #include <stdio.h> #define N 10 int main() { int i, j, k,temp; int a[N]; printf("please input %d numbers:/n",N); for(i = 0; i < N; i++) { scanf("%d",&a[i]); } for (i = 0; i < N-1; i++) { k = i; //標記起始位置,不能少 for (j = i+1; j < N; j++) { if (a[i] > a[j]) { k = j; //標記將要交換的位置 if (k != i) { temp = a[i]; a[i] = a[k]; a[k] = temp; } } } } for(i = 0; i < N; i++) { printf("%-5d",a[i]); } printf("/n"); return 0; }
3.快速排序:
/************************************************ *程序名稱:快速排序 *作 者: 程鳳明 *日 期:2009-7-20 ************************************************/ #include <stdio.h> //快速排序法的遞歸處理 void QuickSort( int list[15] , int left , int right , int index ) { int i , j , k ; int pivot ; //分割指針 int temp ; //數據交換時暫存變量 i = left ; //設置i爲數組的左指針 j = right + 1 ; //設置j爲數組的右指針 pivot = list[left] ; //取最左邊的元素 if( i < j ) { do { do //從左往右找比pivot大的值 { i++ ; }while( list[i] <= pivot && i <= right ) ; do //從右往左找比pivot小的值 { j-- ; }while( list[j] >= pivot && j > left ) ; if( i < j )//交換list[i]和list[j]的值 { temp = list[i] ; list[i] = list[j] ; list[j] = temp ; printf("/n *Current sorting result:") ; for( k = 0 ; k < index ; k++ ) { printf("%d " , list[k] ) ; } } }while( i < j ) ; //交換list[left]和list[j]的值 temp = list[left] ; list[left] = list[j] ; list[j] = temp ; //打印目前的排序結果 printf("/n #Current sorting result:") ; for( k = 0 ; k < index ; k++) { printf("%d ",list[k] ) ; } QuickSort( list , left , j - 1 , index ) ; //排序左半邊 QuickSort( list , j+1 , right , index ) ; //排序右半邊 } } void main() { int list[20] ; //設置數組最大長度爲20 int node ; //讀入輸入的值所使用的暫存變量 int i , index ; printf("/n Please input the values you want to sort (Exit for 0) : /n") ; index = 0 ; scanf("%d" , &node) ; //讀取數據存到數組中 while( ( node != 0 ) && ( index < 20 ) ) //數據尚未結束 { list[index] = node ; index = index + 1 ; scanf( "%d" , &node ) ; } QuickSort( list , 0 , index - 1 , index ) ; //進行快速排序 printf("/n Final sorting result :") ; //打印最終的排序結果 for( i = 0 ; i < index ; i++) { printf("%d " , list[i] ) ; } }
4堆排序:
/*********************************************** * 函數名稱: 堆排序 * 作 者: 程鳳明 * 時 間: 2009-7-20 ************************************************/ #include <stdio.h> void createHeap(int *, int, int); void HeapSort(int *, int); int main() { int i , index ; int list[20] ; int node ; printf("/nplease input the value you wait to sort(Exit for 0) : /n" ) ; list[0] = 0 ; index = 1 ; scanf("%d" , &node) ; while(node != 0) { list[index] = node ; index++ ; scanf("%d" , &node) ; } index-- ; HeapSort(list , index) ; printf("/nSorting result: ") ; for(i = 1 ; i <= index ; i++) printf("%d " , list[i]); printf("/n") ; return 0; } void createHeap(int *heap , int root , int index) { int j ; int temp ; int finish ; j = 2 * root ; temp = heap[root] ; finish = 0 ; while(j <= index && finish == 0) { if( j < index ) { if(heap[j] < heap[j+1]) j++ ; } if(temp >= heap[j]) finish = 1 ; else { heap[j/2] = heap[j] ; j = 2 * j ; } } heap[j/2] = temp ; } void HeapSort(int *heap , int index ) { int i, temp ; for( i = index / 2 ; i >= 1 ; i--) createHeap( heap , i , index) ; for( i = index - 1 ; i >= 1 ; i--) { temp = heap[i+1] ; heap[i+1] = heap[1] ; heap[1] = temp ; createHeap(heap , 1 , i ) ; } }