yuanli xing 东西就不在这里赘述了,直接上代码先,原理的东西都在代码上面有注释: sort.h
#ifndef __SORT_H_#define __SORT_H_//选择排序算法extern void selectSort(int *num_pointer,const int num);//冒泡排序算法extern void bubbleSort(int *num_pointer,const int num);//冒泡排序算法2extern void bubbleSort2(int *num_pointer,const int num);//交换排序算法extern void swapSort(int *num_pointer,const int num);//插入排序法则extern void insertSort(int *num_pointer,const int num);//折半排序法则extern void celeritySort(int *num_pointer,const int num);#endifsort.c
#include"sort.h"#include"swap.h"/***选择排序法则:9,6,8,7,3*算法规则:每一次将数组中的最大的那个数值筛选出来,将这个值提取出来,与最前面没有进行排序的数组元素进行比较*那前面没有比较的数值的次数就是整个数组长度-1次,这也是外层循环的次数*内层循环也就是从没有比较数组的后面一个数值开始,假设当前没有比较的元素的位置是i的话,那么开始项的位置就是i+1**注意:选择排序法只是将最大的数值的位置记录下来,最后再进行一次互换,所以默认有一个记录的下标;用来记录位置,即pos*然后用后续的元素与这个最大的数值进行比较**选择排序在整个排序过程中进行了N*(N-1)/2次排序,适用于数组数量比较小的数组*/extern void selectSort(int *num_pointer,const int num){ int pos; int i_count = 0; int j_count = 0; int *pointer = num_pointer; for( i_count = 0; i_count < num-1; i_count++) { pos = i_count; for(j_count = i_count + 1;j_count < num; j_count++) { if(*(pointer+pos) < *(pointer+j_count)){ pos = j_count; } } if(pos != i_count){ swap(pointer+i_count,pointer+pos); } } PRintf_array(num_pointer,num);}/***冒泡排序法则:*算法规则:冒泡排序法则是在排序的时候,每一次都是去比较相邻的两个数组的数值a[j]与a[j+1]比较,如果需要swap就会立马进行swap,从而将最大的数值筛选出来,然后后一次的比较从前一个最大值的位置下一位元素开始,所以外层的循环为(数组长度-1)次*内层循环次数:如果是从数组的0位置开始比较的话,那么循环的内层比较次数为(数组长度-i-1)*如果是从最后一个位置开始来进行比较的话,内层的比较条件为(j=数组长度-1,j>=i;j--);**注意:不同的方向进行比较的时候,其判别条件也是不一样的 **冒泡排序最好的是正序,只要一次,最差的是逆序,需要n×n次,冒泡排序相对是比较稳定的一种排序法,如果数组稍微有序,则效果是比较好的*/extern void bubbleSort(int *num_pointer,const int num){ int i_count = 0; int j_count = 0; int *pointer = num_pointer; for(i_count = 0;i_count<num;i_count++){ for(j_count = 0;j_count<num-i_count-1;j_count++){ if(*(pointer+j_count) < *(pointer+j_count+1)){ swap(pointer+j_count,pointer+j_count+1); } } } printf_array(num_pointer,num);}extern void bubbleSort2(int *num_pointer,const int num){ int i_count = 0; int j_count = 0; int *pointer = num_pointer; for(i_count = 1;i_count < num ;i_count++){ for(j_count = num -1 ;j_count >= i_count;j_count--){ if(*(pointer+j_count) > *(pointer+j_count-1)){ swap(pointer+j_count,pointer+j_count-1); } } } printf_array(num_pointer,num);}/***交换排序法则:每一次比较都会进行一次互换,比较的前一个数值从0,到num-1*比较的后值从1,num;(从前数值的后一项开始的,即从i_count+1开始);**注意:在每一次比较的时候都是会进行交换的**与冒泡排序是一样的,正序是最快的,而倒序是最慢的,所以数组稍微有序的时候,效果是比较好的*/extern void swapSort(int *num_pointer,const int num){ int i_count; int j_count; int *pointer = num_pointer; for(i_count = 0; i_count < num-1;i_count++){ for(j_count=i_count + 1;j_count < num ;j_count++){ if(*(pointer+i_count) < *(pointer+j_count)){ swap(pointer+i_count,pointer+j_count); } } } printf_array(num_pointer,num);}/***插入排序法则**插入排序法则相对是比较复杂,其根本工作原理就是抽出一个数据,在前面的数据中寻找相应的位置,然后进行插入,然后继续下一个数据,一直到数据完成排序*1:首先取出第一数值*2:取出第二个数值,如果第二个数值大于第一个数值,就放在第一个的后面。如果小于就放前面*3:取出第三个数值,与最后一个数值进行比较,如果大于就放后面。如果小于,就与前面一个数值进行比较,再判断放在前面还是后面*4:以此类推,总是先与最后一个数值进行比较**优点:如果数组有序那么会具有较快的运算速度 */extern void insertSort(int *num_pointer,const int num){ int i_count = 0; int *pointer = num_pointer; int temp; int pos; //从0开始意思是第一次取出一个数值,从1开始就是默认拿出了第一个数值 for(i_count = 1;i_count<num;i_count++){ temp = *(pointer+i_count);//取出的数值 pos = i_count-1;//最后一个数值的位置 //当当前元素的前面位置>0并且当前位置的数值小于前面的数值的时候(取出的数值小于最后一个数值) while((pos>=0) && (temp < *(pointer+pos))){ swap(pointer+1+pos,pointer+pos); pos--; } *(pointer+pos+1) = temp; } printf_array(num_pointer,num);} /***折半排序法则*折半排序算法通常也叫做快速排序算法,是选择中间的一个数值middle,然后把中间数值小的放在左边,比中间数值大的数据放在右边,然后对两边分别进行递归的方法进行重新调用;*1:先取出中间的数值*2:左边去与中间middle进行比较,如果左边的数值大于middle,筛选出来*3:右边的数值与中间middle进行比较,如果右边的小于middle,筛选出来,将左右两边的这两个数值进行互换,然后再将pos各往下一个元素提一位,再次进行比较*这样可以在第一次遍历完了之后,将以中间middle为基准的数值,进行左右分布,*4:然后再次将左边的一组进行单独二分排序,将右边的一组进行二分排序*/extern void celeritySort(int * num_pointer,const int left,const int right){ int *pointer = num_pointer; int i_count = left; int j_count = right; int middle = *(pointer+(left+right)/2);//拿到最中间的数的数值 do{ while((*(pointer+i_count) < middle) && (i_count<right)){ i_count++; } while((*(pointer+j_count) > middle) && (j_count>left)){ j_count--; } if(i_count <= j_count){ swap(pointer+i_count,pointer+j_count); i_count++; j_count--; } }while(i_count<=j_count); //递归左边 if(left<j_count){ celeritySort(num_pointer,left,j_count); } //递归右边 if(i_count<right){ celeritySort(num_pointer,i_count,right); } printf_array(num_pointer,right+1);}swap.h
#ifndef __SWAP_H__#define __SWAP_H_extern void swap(int *,int *);extern void printf_array(int *,int);#endifswap.c
#include"swap.h"#include<stdio.h>extern void swap(int *num_pointer1,int *num_pointer2){ int temp; temp = *num_pointer1; *num_pointer1 = *num_pointer2; *num_pointer2 = temp;}extern void printf_array(int * pointer,int num){ int count = 0; for(count;count<num;count++){ printf("position:[%d]:value:%d/n",count,*(pointer+count)); }}ceshi daima : sort_algorithm.c
#include<stdio.h>#include<stdio.h>#include"sort.h"#include"swap.h"int main(int argc,char *argv[]){ int select = 0; int array_length; int num = 0; printf("==============/n"); printf("1:selectSort/n"); printf("2:bubbleSort/n"); printf("3:bubbleSort2/n"); printf("4:swapSort/n"); printf("5:insertSort/n"); printf("6:celeritySort/n"); printf("==============/n"); scanf("%d",&select); printf("please input the array length you want!!/n"); scanf("%d",&array_length); int array_nums[array_length]; for(num ;num<array_length;num++){ printf("please input the array element/n"); scanf("%d",&array_nums[num]); } printf_array(array_nums,array_length); printf("---------------------------/n"); if(select == 1){ selectSort(array_nums,array_length); }else if(select == 2){ bubbleSort(array_nums,array_length); }else if(select == 4){ swapSort(array_nums,array_length); }else if(select == 3){ bubbleSort2(array_nums,array_length); }else if(select == 5){ insertSort(array_nums,array_length); }else if(select == 6){ celeritySort(array_nums,0,array_length-1); }else{ printf("select error/n"); } return 0;}最后谢谢大家的访问:欢迎大家持续访问,有错误的地方希望各位看客能够及时指出,谢谢
新闻热点
疑难解答