参考<<大话数据结构>>,仅做学习记录
- 冒泡排序算法
通过不停的循环,每次把最小的数据往上移,然后把需要循环的数据量依次减少,完成排序。第一次:把最小数据放到最上面,第二次:把倒数第二小数据放到第二上面。
#include "stdio.h" #include "stdlib.h" int val[10] = {9,10,2,5,6,7,3,8,1,4}; void swapVal(int* a, int* b) { int tmp = *a; *a = *b; *b = tmp; } void Bubbsort(int* va, int size) { for (int i = 0; i < size; i++) { // val[0] -- val[9] for (int j = size-2; j >= i; j--) { if (va[j] > va[j+1]) { swapVal(&va[j], &va[j+1]); } } printVal(val, sizeof(val) / sizeof(int)); printf("\n"); } } int printVal(int* a, int size) { for (int i = 0; i < size; i++) { printf("%d ", a[i]); } } int main() { // printVal(val, sizeof(val) / sizeof(int)); printf("\n"); Bubbsort(val, sizeof(val) / sizeof(int)); // printVal(val, sizeof(val) / sizeof(int)); printf("\n"); return 0; } /* zion6135@zion6135-VirtualBox:~/Desktop/lbw/sjjg$ ./a.out 1 9 10 2 5 6 7 3 8 4 1 2 9 10 3 5 6 7 4 8 1 2 3 9 10 4 5 6 7 8 1 2 3 4 9 10 5 6 7 8 1 2 3 4 5 9 10 6 7 8 1 2 3 4 5 6 9 10 7 8 1 2 3 4 5 6 7 9 10 8 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 zion6135@zion6135-VirtualBox:~/Desktop/lbw/sjjg$ */
上述的打印明显可以看出,多排了几次,可以做如下修改来优化排序算法
void Bubbsort(int* va, int size) { bool sequenceOk = true; for (int i = 0; i < size; i++) { // val[0] -- val[9] sequenceOk = true; for (int j = size-2; j >= i; j--) { // i = 0123456789 j = 8~0|8~1|8~2|8~3|8~4|8~5|8~6|8~7 if (va[j] > va[j+1]) { swapVal(&va[j], &va[j+1]); sequenceOk = false; } } if (sequenceOk == true) { break; } printVal(val, sizeof(val) / sizeof(int)); printf("\n"); } }
- 简单选择排序法
#include "stdio.h" #include "stdlib.h" int val[] = {9,5,8,3,7,4,6,1,2}; #define bool int #define true 1 #define false 0 void swapVal(int* a, int* b) { int tmp = *a; *a = *b; *b = tmp; } int printVal(int* a, int size) { for (int i = 0; i < size; i++) { printf("%d ", a[i]); } printf("\n"); } void Bubbsort(int* va, int size) { /* rintf("---[%d]---\n", size);*/ for (int i = 0; i < size; i++) { // find min in va[1]~va[8] int minofst = 0; int min; min = va[i]; printf("---[%d]---\n", va[i]); for (int j = i+1; j < size; j++) { if (min > va[j]) { min = va[j]; minofst = j; } } /* printf("---[%d]---\n", minofst); printf("---[%d]---\n", min); */ // compare va[i] and min // if .. > .. swap if (va[i] > min) { swapVal(&va[i], &va[minofst]); } printVal(va, sizeof(val)/sizeof(int)); } } int main() { printVal(val, sizeof(val)/sizeof(int)); printf("\n"); Bubbsort(val, sizeof(val)/sizeof(int)); printf("\n"); return 0; }
- 直接插入排序-----debug记录每步的操作------梳理出流程
// #include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; void InsertSort(int a[],int l) { int temp; for (int i = 0; i < l; i++) { if (a[i] < a[i-1]) { // 应该排序 temp = a[i]; int j =0; // 依次前移直到遇到比temp小的数字,并退出 for (j = i-1; j>=0; j--) { if (a[j] > temp) { a[j+1] = a[j]; } else { break; } } // 在这个地方把数字插入 a[j+1] = temp; } } for(int k=0;k<l;k++) cout<<a[k]<<" "; cout<<endl; } int main() { int a[10]={2,5,8,3,6,9,1,4,7}; int b[10]={1,2,3,4,5,6,7,8,9}; int len=9; InsertSort(a,len); return 0; }