您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: