常见的排序算法
交换两变量的值swap函数
void swap(int *a,int *b){
if(a == b) return; //当两指针指向同一地址时,*a = *a^*a; 1^1==0 ,异或本身为0
//if(*a == *b) return;
*a ^= *b; //所有就有这样的疑惑,不同地址但地址所存数值相同,进行以下异或操作也能交换,若*a=1,*b=1,经过26line异或操作*a=0
*b ^= *a; //*b = 1^0,执行该行后,*b=1
*a ^= *b; //*a = 0^1,执行改行后,*a=1,所以若两值相同可以不必要经过异或操作(不是不行,单没必要),加一条判断即25line
}
1.冒泡排序(BubbleSort)
冒泡排序实现:
/**
* 从小到大,冒泡排序
*/
void bubble_sort(int arr[],int len){
for(int i = 0; i < len -1; i++){ //循环冒泡次数为len-1
for(int j = 0; j < len-1-i; j++){ //最多交换次数len-1次,每次循环冒泡一个数减少1次交换次数
if(arr[j]>arr[j+1]) swap(&arr[j],&arr[j+1]);
}
}
}
2.选择排序
插入排序实现:
/**
* 从小到大,选择排序
*/
void select_sort(int arr[],int len){
for(int i = 0; i < len-1; i++){ //选择最小沉淀到arr[i]
int min = i;
int j;
for(j=i+1; j < len; j++){
if(arr[j] < arr[min])
min = j;
}
swap(&arr[min],&arr[i]);
}
}
3.插入排序
插入排序:
/**
* 插入排序,实现从小到大排序
* 在已排序序列中从后向前扫描,找到相应位置并插入。用零时变量存储插入的元素
*/
void insert_sort(int arr[],int len){
int i,j,temp;
for(i = 1; i < len; i++){//从第二个元素开始insert已排序的序列(该序列暂时只有第一元素)
temp = arr[i]; // 将temp指向第二个元素
/**
*j为当前临时temp的索引,判断当前temp所指元素是否小于前一元素
*若temp小于前一元素则后移一位,跳出循环时,j为最后移动过的元素且,该索引前一元素小于或等于temp所指要insert元素
*/
for(j = i; j > 0 && arr[j-1] > temp; j--){
arr[j] = arr[j-1];
}
arr[j] = temp;
}
}