内存复制,交换排序,洗牌函数

1.string.h里面有一掇内存函数,其中两个是memcpy和memmove,据说两者是有差别的,前面那个是拷贝,区域重合时会覆盖数据;后面那个是移动,效率稍低,但是可以定住重合压力。来个memmove的演示代码:

#include <stdio.h>

/*移动src的siz个字节到dest,且当两个区域重合时也能正常移动*/
void memory_move(char *dest, const char *src, size_t siz){
int off = 0;
size_t i, j;
if(dest >= src && dest < (src + siz)){
off = dest - src;
}
for(i = off; i < off+siz; ++i){
j = i < siz ? i:i-siz;
*(dest+j) = *(src+j);
}
}

int main(){
char buf[] = "987654321";
char buf2[10];
memory_move(buf2, buf, 10);
memory_move(buf+3, buf, 6);
printf("%s and %s\n", buf, buf2);
memory_move(buf, buf2, 10);
memory_move(buf, buf, 10); //即使是自己拷贝自己也没问题,好像没多大意义=_=#
return 0;
}

2.看到一个帖子,说不会交换和冒泡的学生是废柴。

#include <stdio.h>
//看起来还是比较乱的
void swap_sort(char *arr, size_t siz){
size_t i = 1;
char t;
while(i < siz){
i = i < 1 ? 1:i; //前边已经没有更小的数了
if(arr[i-1] > arr[i]){//交换一对数,导致较小数往前移动了
t = arr[i-1];
arr[i-1] = arr[i];
arr[i] = t;
--i;
}else{ //较大数都在后边
++i;
}
}
}
int main(){
char buf[] = "987654321";
swap_sort(buf, 9);
printf("%s\n", buf);
}

3.洗牌函数。常用。

#include <stdlib.h>
#include <stdio.h>
void shuffle(char *arr, size_t siz){
int i, j;
char t;
for(i = 0; i < siz-1; ++i){
j = rand()%(siz-i)+i;
t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
int main(){
char buf[] = "987654321";
shuffle(buf, 9);
printf("%s\n", buf);
return 0;
}





你可能感兴趣的:(排序)