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 ) ; } }