1算法(含冒泡排序的优化及打乱顺序)
2015-02-23 10:55
218 查看
int main(int argc,const
char * argv[]) {
int a[] = {10,2,
3,5,
6,4,
7,8,
9,1};
int count =sizeof(a) /
sizeof(a[0]);
冒泡排序优化版
假设本来的数据本来就是从小到大有序的,则原有算法仍要做count-1趟比较操作,事实上,一趟比较下来,若发现没有进行过交换,若发现没有进行过交换,就已经说明数据全部有序,无须进行其后的比较操作了。经过少于count-1趟比较交换操作后,数据就已经有序的概率却非常高。这时就考虑用标志量来记录每趟交换数据的的情况,如flag=1表示没有进行过交换(有序),一旦有数据进行交换则置flag为0(无序),表示已进行过交换,当一趟比较交换完成后,若flag仍为1时,则无须进行下一趟操作,否则若flag为0时,只能继续进行下一趟操作。
// int flag = 0; //0无序 1有序
// for ( i = 0; i < count - 1 && 0 == flag; i++) {
// flag = 1;
// for (int j = 0 ; j < count - 1 - i; j++) {
// if (a[j] > a[j + 1]) {
// int t = a[j];
// a[j] = a[j + 1];
// a[j + 1] = t;
// flag = 0; //确定无序
// }
// }
// }
// printf("%d\n", i); //进行了多少次冒泡;
//
// for (int i = 0; i < count; i++) {
// printf("%d\n", a[i]);
// }
//冒泡排序
// int flag = 0;
// for (int i = 0; i < count - 1 && 0 == flag; i++) {
// flag = 1;
// for (int j = 0; j < count - 1 - i; j++) {
// if (a[j] > a[j + 1]) {
// int temp = a[j];
// a[j] = a[j + 1];
// a[j + 1] = temp;
// flag = 0;
// }
// }
// }
// for (int i = 0; i < count; i++) {
// printf("%d\n", a[i]);
// }
//选择排序
//
// for (int i = 0; i < count - 1; i++) {
// int minindex = i;
// for (int j = minindex + 1 ; j < count; j++) {
// if (a[minindex] > a[j]) {
// minindex = j;
// }
// }
// if (minindex != i) {
// int temp;
// temp = a[minindex];
// a[minindex] = a[i];
// a[i] =temp;
// }
// }
// for (int i =0; i < count; i++) {
// printf("%d\n", a[i]);
// }
//插入排序
// for (int i = 1; i < count ; i++) {
// int j = i;
// int temp = a[j];
// while (j > 0 && temp < a[j - 1] ) {
// a[j] = a[j - 1];
// j--;
// }
// a[j] = temp;
// }
// for (int i = 0 ; i < count ; i++) {
// printf("%d\n", a[i]);
// }
//
快速排序
void quickSort(int array[], int count) {
int start = 0;
int end = count - 1;
int temp = array[start];
if (count < 2) {
return;
}
while (start < end) {
while (start < end && array[end] > temp) {
end--;
}
if (start < end) {
array[start] = array[end];
start++;
}
while (start < end && array[start] < temp) {
start++;
}
if (start < end) {
array[end] = array[start];
end--;
}
}
array[start] = temp;
quickSort(array, start);
quickSort(array + start + 1, count - start - 1);
}
折半查找
// int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// int count = 10;
// int tagert = 6;
// int mid = 0;
// int i = 0, j = count - 1;
//
// while (i <= j) {
// mid = (i + j) / 2;
// if (array[mid] > tagert) {
// j = mid - 1;
// }
// else if (array[mid] < tagert) {
// i = mid + 1;
// }
// else {
// break;
// }
// }
// if (i <= j) {
// printf("%d\n", mid);
// }
// else {
// printf("not found\n");
// }
//打乱顺序 俗称洗牌。
// for (int i = count - 1; i > 0; i--) {
// int rindex = arc4random() % (i + 1);
// if (rindex != i) {
//
// int temp;
// temp = a[rindex];
// a[rindex] = a[i];
// a[i] = temp;
// }
// }
//
// for (int i = 0; i < count; i++) {
// printf("[%2d]: %d\n", i, a[i]);
// }
return0;
}
char * argv[]) {
int a[] = {10,2,
3,5,
6,4,
7,8,
9,1};
int count =sizeof(a) /
sizeof(a[0]);
冒泡排序优化版
假设本来的数据本来就是从小到大有序的,则原有算法仍要做count-1趟比较操作,事实上,一趟比较下来,若发现没有进行过交换,若发现没有进行过交换,就已经说明数据全部有序,无须进行其后的比较操作了。经过少于count-1趟比较交换操作后,数据就已经有序的概率却非常高。这时就考虑用标志量来记录每趟交换数据的的情况,如flag=1表示没有进行过交换(有序),一旦有数据进行交换则置flag为0(无序),表示已进行过交换,当一趟比较交换完成后,若flag仍为1时,则无须进行下一趟操作,否则若flag为0时,只能继续进行下一趟操作。
// int flag = 0; //0无序 1有序
// for ( i = 0; i < count - 1 && 0 == flag; i++) {
// flag = 1;
// for (int j = 0 ; j < count - 1 - i; j++) {
// if (a[j] > a[j + 1]) {
// int t = a[j];
// a[j] = a[j + 1];
// a[j + 1] = t;
// flag = 0; //确定无序
// }
// }
// }
// printf("%d\n", i); //进行了多少次冒泡;
//
// for (int i = 0; i < count; i++) {
// printf("%d\n", a[i]);
// }
//冒泡排序
// int flag = 0;
// for (int i = 0; i < count - 1 && 0 == flag; i++) {
// flag = 1;
// for (int j = 0; j < count - 1 - i; j++) {
// if (a[j] > a[j + 1]) {
// int temp = a[j];
// a[j] = a[j + 1];
// a[j + 1] = temp;
// flag = 0;
// }
// }
// }
// for (int i = 0; i < count; i++) {
// printf("%d\n", a[i]);
// }
//选择排序
//
// for (int i = 0; i < count - 1; i++) {
// int minindex = i;
// for (int j = minindex + 1 ; j < count; j++) {
// if (a[minindex] > a[j]) {
// minindex = j;
// }
// }
// if (minindex != i) {
// int temp;
// temp = a[minindex];
// a[minindex] = a[i];
// a[i] =temp;
// }
// }
// for (int i =0; i < count; i++) {
// printf("%d\n", a[i]);
// }
//插入排序
// for (int i = 1; i < count ; i++) {
// int j = i;
// int temp = a[j];
// while (j > 0 && temp < a[j - 1] ) {
// a[j] = a[j - 1];
// j--;
// }
// a[j] = temp;
// }
// for (int i = 0 ; i < count ; i++) {
// printf("%d\n", a[i]);
// }
//
快速排序
void quickSort(int array[], int count) {
int start = 0;
int end = count - 1;
int temp = array[start];
if (count < 2) {
return;
}
while (start < end) {
while (start < end && array[end] > temp) {
end--;
}
if (start < end) {
array[start] = array[end];
start++;
}
while (start < end && array[start] < temp) {
start++;
}
if (start < end) {
array[end] = array[start];
end--;
}
}
array[start] = temp;
quickSort(array, start);
quickSort(array + start + 1, count - start - 1);
}
折半查找
// int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// int count = 10;
// int tagert = 6;
// int mid = 0;
// int i = 0, j = count - 1;
//
// while (i <= j) {
// mid = (i + j) / 2;
// if (array[mid] > tagert) {
// j = mid - 1;
// }
// else if (array[mid] < tagert) {
// i = mid + 1;
// }
// else {
// break;
// }
// }
// if (i <= j) {
// printf("%d\n", mid);
// }
// else {
// printf("not found\n");
// }
//打乱顺序 俗称洗牌。
// for (int i = count - 1; i > 0; i--) {
// int rindex = arc4random() % (i + 1);
// if (rindex != i) {
//
// int temp;
// temp = a[rindex];
// a[rindex] = a[i];
// a[i] = temp;
// }
// }
//
// for (int i = 0; i < count; i++) {
// printf("[%2d]: %d\n", i, a[i]);
// }
return0;
}
相关文章推荐
- 顺序表上实现冒泡排序及其优化
- 冒泡排序及其优化
- 百度笔试题:一个已经排序好的很大的数组,现在给它划分成m段,每段长度不定,段长最长为k,然后段内打乱顺序,请设计一个算法对其进行重新排序
- 分享两个JavaScript打乱数组顺序实现随机排序洗牌的方法(应用于音乐视频的随机播放等)
- 也谈冒泡排序(bubble sort)---两次‘优化’
- Google算法题:随机打乱Vector的顺序输出
- 洗牌算法:随机打乱一个数组的顺序
- 机器学习(七、八):SVM(支持向量机)【最优间隔分类、顺序最小优化算法】
- 【慢查询优化】建索引时注意字段选择性&范围查询注意组合索引的字段顺序
- 简易冒泡排序(未优化版)
- 经典算法之二:冒泡排序及优化
- 类加载器 在加载类时可能会对类内的方法内代码顺序做优化
- python打乱数组顺序
- C数据结构-优化顺序队列
- 如何生成1-1000的数字,并且顺序打乱
- SQL语句执行顺序以及oracle基本查询优化
- 优化后的冒泡排序(Bubble Sort)
- 冒泡排序 优化
- 内核初始化优化宏 ,初始化顺序, __init,__devexit等
- 第07天C语言(12):选择-冒泡排序优化