> 文档中心 > 各种经典排序算法的实现C语言版本,可直接使用(加必要的文字说明)

各种经典排序算法的实现C语言版本,可直接使用(加必要的文字说明)

#include#define MAXSIZE 100typedef int dataType;typedef struct {dataType key;char name[5];}Data;typedef struct {Data r[MAXSIZE + 1];int length;}SeqList;//直接插入排序int InsertSort(SeqList *L) {int i = 2;//从第二个位置开始排序if (L->length == 1){return 1; //一个元素,不用排序}while (i length) {if (L->r[i].key r[i-1].key){//如果当前i比它前一个元素小,则没有必要进行排序了L->r[0] = L->r[i]; //将元素放入0号位置int j = i - 1;while (L->r[0].key r[j].key) {L->r[j + 1] = L->r[j];//移动元素j--;}L->r[j + 1] = L->r[0];//将元素插入}i++;} return 1;}//冒泡排序法int buble_sort(SeqList *L) {int flag = 1;for (int i = L->length; i >0 && flag == 1; i--){flag = 0; //置标志域,当发生了交换,则设置为1,若一遍排序之后元素没发生交换,则说明元素有序for (int j = 1; j r[j].key >L->r[j+1].key){//交换元素,将值较大的往后移L->r[0] = L->r[j];L->r[j] = L->r[j + 1];L->r[j + 1] = L->r[0];flag = 1;}}}return 1;}//快速排序法  最快的排序算法int QKpass(SeqList *L,int low,int high) {L->r[0] = L->r[low];while (low < high) {while (low r[high].key >= L->r[0].key) high--;L->r[low] = L->r[high];while (low r[low].key r[0].key) low++;L->r[high] = L->r[low];}L->r[low] = L->r[0];return low;}//快速排序,调用上面的处理过程void QKSort(SeqList *L, int low, int high) {int pos;if (low < high){pos = QKpass(L, low, high);QKSort(L, 1, pos);QKSort(L, pos+1, high);}}//选择排序法int selectSort(SeqList *L) {Data temp;for (int i = 1; i length; i++){int j = i;for (int k = i+1; k  length; k ++){//内循环一个记录剩下元素最小值的下标if (L->r[j].key > L->r[k].key){j = k;}}if (j != i){//交换元素temp = L->r[j];L->r[j] = L->r[i];L->r[i] = temp;}}}/***************************堆排序算法**********************************///调整顶堆void HeapAdjust(SeqList *L, int s, int m) {//已知L->r[s..m]中记录关键字除L->r[s].key之外均满足堆的定义//调整L->r[s]使之成为一个小顶堆Data t = L->r[s];for (int i = s*2; i <= m; i*=2){if (ir[i].key > L->r[i+1].key)){//找出左右子树当中最小的key的下标值i++;}if (t.key r[i].key){//当前堆顶元素比左右子树的key都小,则不用做调整break;}//对元素位置进行调整,使之成为一个堆L->r[s] = L->r[i];s = i; //进入下一层子树}//在循环内部对s做了修改,s指向的是当前堆顶的最后一个叶子结点L->r[s] = t;}//创建顶堆void CreateHeap(SeqList *L) {for (int i = L->length/2; i > 0; i--){HeapAdjust(L, i, L->length);}}//准备工作完成,开始进行堆排序void HeapSort(SeqList *L) {CreateHeap(L); //创建顶堆for (int i = L->length; i>1; i--){//破坏堆顶结构,使之重新调整,然后每次循环将最后一位剪枝L->r[0] = L->r[1];L->r[1] = L->r[i];L->r[i] = L->r[0];HeapAdjust(L, 1, i-1);}}//显示元素值void displaySeqList(SeqList L) {printf("元素的值如下:\n");for (int i = 1; i length = 0;return 1;}//创建序列void create_SeqList(SeqList *L) {printf("请输入元素个数:\n");scanf("%d", &(L->length));for (int i = 1; i length; i++){printf("请输入第%d个元素:\n",i);scanf("%d", &(L->r[i].key));}}main() {SeqList L;initSeqList(&L);create_SeqList(&L);HeapSort(&L);//自己更换排序的函数调用,这里使用的是堆排序,其它排序函数已经写好displaySeqList(L);}