最近看数据结构,把常用的排序算法用C语言写了一下。
没有按数据结构上的定义SqList结构体,只是用数组的形式实现。
有的算法并没有完全按书上给出的算法,但思路一致。
#include<stdio.h> void InsertSort(int[], int); //直接插入排序 无哨兵 void BInsertSort(int[], int); //折半插入排序 void BubbleSort(int[], int); //起泡排序 void QSort(int[], int, int); //快速排序 void SelectSort(int[], int); //简单选择排序 int main(){ //int num[] = {12,23,21,23,123,21,2,221,12,44}; int num[] = {4,3,6,7,2,13,21,9,8,34}; //int num[] = {38,65,97,76,13,27,49}; //快排使用 int i; int len = 10; //InsertSort(num, len); //BInsertSort(num, len); //BubbleSort(num, len); //len = 7; //QSort(num, 0, len-1); //SelectSort(num, len); for(i=0; i<len;i++) { printf("%d ", num[i]); } printf("\n"); return 0; } //直接插入排序,前i个数保持有序 void InsertSort(int num[], int len) { //直接插入排序 无哨兵 int i,j,temp; for(i=1; i<len; i++){ temp = num[i]; for(j=i; j>0; j--) { if(temp < num[j-1]){ num[j] = num[j-1]; }else{ break; } } num[j] = temp; } } //折半插入排序 void BInsertSort(int num[], int len){ int i,j,temp,low,high,mid; for(i=1; i<len; i++) { if(num[i] >= num[i-1]) continue; temp = num[i]; low = 0; high = i-1; mid = (low + high)/2; while(low <= high) { if(num[mid] > temp){ high = mid - 1; }else { low = mid + 1; } mid = (low + high)/2; } //二分查找完成后,low会指向应插入的位置 for(j=i; j>=low; j--) { num[j] = num[j-1]; } num[low] = temp; } } //起泡排序 void BubbleSort(int num[], int len){ int i, j, temp; int change = 1; for(i=len; i>0; i--) { if(change == 0) break; change = 0; for(j=1; j<i; j++) { if(num[j-1] > num[j]){ temp = num[j-1]; num[j-1] = num[j]; num[j] = temp; change = 1; } } } } //快速排序 int Partition(int num[], int low, int high) { //一趟快排,返回枢轴位置 int temp = num[low]; while(low < high) { while(low<high && num[high] >= temp) --high; num[low] = num[high]; while(low<high && num[low] <= temp) ++low; num[high] = num[low]; } num[low] = temp; return low; } void QSort(int num[], int low, int high) { //递归进行快速排序 int pivotloc; if(low < high){ pivotloc = Partition(num, low, high); QSort(num, low, pivotloc-1); QSort(num, pivotloc+1, high); } } //简单选择排序 //算法描述:i:0→len; get minValueTag from [i] to [len-1]; [i]<>[minValueTag]; void SelectSort(int num[], int len){ int i, j, minValueTag, temp; for(i=0; i<len; i++) { minValueTag = i; for(j=i; j<len; j++) { if(num[j] < num[minValueTag]){ minValueTag = j; } } if(minValueTag != i){ temp = num[i]; num[i] = num[minValueTag]; num[minValueTag] = temp; } } }仅供参考,因个人水平及时间有限,文章的错误和不足之处还望指正。
参考文献:
《数据结构(C语言版)》 严蔚敏 吴伟民 著 清华大学出版社