常见排序算法及实现
关于冒泡最优情况说明一下,O(n)是指在使用标志情况下,否则仍是O(n)。
冒泡排序:
//本人习惯先把最大的选出来,放到右边 void maopao(int arr[],int n) { int i,j,tmp;//tmp提前写上,或者及时补上! for (i=n-1;i>=0;i--)//不能少写等号! for(j=0;j<i;j++) { if(arr[j]>arr[j+1])//不比较等于情况!否则就不稳定了! { tmp=arr[j+1]; arr[j+1]=arr[j]; arr[j]=tmp; } } return; }
使用标志的冒泡排序,最好可达到O(n):
void bubble_sort(int d[], int size) { //假定两两交换发生在数组最后的两个位置 int exchange = size - 1; while(exchange) { int bound = exchange;//记录下发生数据交换的位置 exchange = 0; //假定本趟比较没有数据交换 for(int i = 0; i < bound; i++) { if (d[i] > d[i + 1])//交换 { int t = d[i]; d[i] = d[i + 1]; d[i + 1] = t; exchange = i + 1; } } } }
快速排序:
void fast(int arr[],int left,int right) { int i,j,k; if(left<right){ i=left+1;j=right; while(i<j){ while(arr[i]<arr[left]&&i<right)i++;// while(arr[j]>arr[left]&&j>left)j--;// if(i<j) swap(&arr[i],&arr[j]);//大部分时候必要,最后那次在循环外完成 }; swap(&arr[j],&arr[left]);// fast(arr,left,j-1); fast(arr,j+1,right); } return; }
插入排序:
void insert(int arr[],int n) { int i=0,j=0,k=0,tmp; for(i=1;i<=n-1;i++) { for(j=i-1;j>=0;j--)//忘记写=0了,结果gdb半天才发现! { if(arr[j]>arr[j+1])// swap(&arr[j],&arr[j+1]); else break; } } return; }
选择排序:
void select1(int arr[],int n) { int i=0,c=0,j=0; int place,min;// for(i=0;i<n;i++) { min=arr[i];;//切莫忘记每次初始化,否则各种奇怪错误!仅在外面初始化为0还不够! for(j=i+1;j<=n;j++) if (arr[j]<min) { min=arr[i];place=j; } if(place!=i) swap(&arr[i],&arr[place]); } return; } void select2(int arr[],int n) { int i=0,c=0,j=0,place=0,min=0; min=arr[1]; for(i=c;i<n;i++) { for(j=i+1;j<=n;j++) if (arr[j]<min) {min=arr[i];place=j;} swap(&arr[i],&arr[place]); c++; } return; }