#include<stdio.h>
void bubble(int *a, int len)
{
int i, j,tmp;
for (j = len -1; j >0; j--){
for(i=0; i<j; i++) {
if (a[i] > a[i+1]){
tmp = a[i];
a[i] = a[i+1];
a[i+1] = tmp;
}
}
}
}
void bubble_opt1(int *a, int len)
{
int i, j,tmp;
int flag;
for (j = len -1; j >0; j--){
flag = 0;
for(i=0; i<j; i++) {
if (a[i] > a[i+1]){
tmp = a[i];
a[i] = a[i+1];
a[i+1] = tmp;
flag = 1;
}
}
if (flag == 0) break;
}
}
void bubble_opt2(int *a, int len)
{
int i, j,tmp,index = -1;
for (j = len -1; j >0; ){
if (index != -1 ) {
j = index;
printf("index = %d\n", index+1);
index = -1;
}
for(i=0; i<j; i++) {
if (a[i] > a[i+1]){
tmp = a[i];
a[i] = a[i+1];
a[i+1] = tmp;
index = i;
}
}
if (index == -1) {
printf("break index = %d,j = %d\n", index, j);
break;
}
}
}
void insertSort(int *a, int len){
int i,j,temp;
for (i=1; i < len; i++) {
temp = a[i];
for(j=i-1; j>=0 && temp < a[j]; j--) {
a[j+1] = a[j];
}
a[j+1] = temp;
}
}
int binarySearch(int *array,int low,int high,int temp){
int mid = 0;
while (low <= high){
mid = (low + high)/2;
if (array[mid] < temp && temp <= array[mid +1])
return mid +1;
else if (array[mid] < temp)
low = mid +1;
else
high = mid -1;
}
return high;
}
void binarySort(int *a,int len){
int i,j,temp,k;
for (i=1;i<len;i++){
temp = a[i];
k = binarySearch(a,0,i,temp);
for (j=i;j>k;j--) a[j] = a[j-1];
a[k] = temp;
}
}
void printArray(int *a, int len){
int i=0;
for (i = 0; i<len; i++){
printf("%d,",a[i]);
}
printf("\n");
}
void main(int argc, char *argv[])
{
int a[] = {20,3,1,4,2,13,11,9};
//int a[] = {4,2,3,1,6,9,5,8,7};
int lens = sizeof(a)/sizeof(int);
printArray(a,lens);
//bubble(a, lens);
//bubble_opt1(a,lens);
//bubble_opt2(a,lens);
//insertSort(a,lens);
binarySort(a,lens);
printArray(a,lens);
}
void bubble(int *a, int len)
{
int i, j,tmp;
for (j = len -1; j >0; j--){
for(i=0; i<j; i++) {
if (a[i] > a[i+1]){
tmp = a[i];
a[i] = a[i+1];
a[i+1] = tmp;
}
}
}
}
void bubble_opt1(int *a, int len)
{
int i, j,tmp;
int flag;
for (j = len -1; j >0; j--){
flag = 0;
for(i=0; i<j; i++) {
if (a[i] > a[i+1]){
tmp = a[i];
a[i] = a[i+1];
a[i+1] = tmp;
flag = 1;
}
}
if (flag == 0) break;
}
}
void bubble_opt2(int *a, int len)
{
int i, j,tmp,index = -1;
for (j = len -1; j >0; ){
if (index != -1 ) {
j = index;
printf("index = %d\n", index+1);
index = -1;
}
for(i=0; i<j; i++) {
if (a[i] > a[i+1]){
tmp = a[i];
a[i] = a[i+1];
a[i+1] = tmp;
index = i;
}
}
if (index == -1) {
printf("break index = %d,j = %d\n", index, j);
break;
}
}
}
void insertSort(int *a, int len){
int i,j,temp;
for (i=1; i < len; i++) {
temp = a[i];
for(j=i-1; j>=0 && temp < a[j]; j--) {
a[j+1] = a[j];
}
a[j+1] = temp;
}
}
int binarySearch(int *array,int low,int high,int temp){
int mid = 0;
while (low <= high){
mid = (low + high)/2;
if (array[mid] < temp && temp <= array[mid +1])
return mid +1;
else if (array[mid] < temp)
low = mid +1;
else
high = mid -1;
}
return high;
}
void binarySort(int *a,int len){
int i,j,temp,k;
for (i=1;i<len;i++){
temp = a[i];
k = binarySearch(a,0,i,temp);
for (j=i;j>k;j--) a[j] = a[j-1];
a[k] = temp;
}
}
void printArray(int *a, int len){
int i=0;
for (i = 0; i<len; i++){
printf("%d,",a[i]);
}
printf("\n");
}
void main(int argc, char *argv[])
{
int a[] = {20,3,1,4,2,13,11,9};
//int a[] = {4,2,3,1,6,9,5,8,7};
int lens = sizeof(a)/sizeof(int);
printArray(a,lens);
//bubble(a, lens);
//bubble_opt1(a,lens);
//bubble_opt2(a,lens);
//insertSort(a,lens);
binarySort(a,lens);
printArray(a,lens);
}