diff --git a/Sort/insert_sort.c b/Sort/insert_sort.c index d7dead9..f70a71e 100644 --- a/Sort/insert_sort.c +++ b/Sort/insert_sort.c @@ -6,19 +6,19 @@ // 插入排序 void insert_sort(int *a,int length){ - int tmp ; - int i,j; - for (i = 1; i < length; ++i) - { - - for ( tmp=a[i],j=i-1 ; j>=0 && a[j] > tmp ; j--) - { - a[j+1]=a[j]; - } - // j+1是插入的位置 - a[j+1]=tmp; + int tmp ; + int i,j; + for (i = 1; i < length; ++i) + { + + for ( tmp=a[i],j=i-1 ; j>=0 && a[j] > tmp ; j--) + { + a[j+1]=a[j]; + } + // j+1是插入的位置 + a[j+1]=tmp; - } + } } @@ -27,29 +27,29 @@ void insert_sort(int *a,int length){ void select_sort(int *a,int length){ - int min_index,tmp; - int j; + int min_index,tmp; + int j; - for (int i = 0; i < length; ++i) - { - for (j = i+1 ,min_index=i; j < length; ++j)// 不能写成for (int j = i+1 ,min_index=i; j < length; ++j) - { - if (a[min_index]>a[j]) - { - min_index=j; - } - } + for (int i = 0; i < length; ++i) + { + for (j = i+1 ,min_index=i; j < length; ++j)// 不能写成for (int j = i+1 ,min_index=i; j < length; ++j) + { + if (a[min_index]>a[j]) + { + min_index=j; + } + } - //min_index是最小的元素的index - if (min_index!=i) - { - tmp=a[i]; - a[i]=a[min_index]; - a[min_index]=tmp; - - } - - } + //min_index是最小的元素的index + if (min_index!=i) + { + tmp=a[i]; + a[i]=a[min_index]; + a[min_index]=tmp; + + } + + } } @@ -58,21 +58,21 @@ void select_sort(int *a,int length){ void bubble_sort(int *a, int length){ - int tmp ; + int tmp ; - for (int i = 0; i < length-1; ++i) // 第i轮排序 - { - for (int j = 0; j < length-i; ++j) - { - if (a[j] > a[j+1]) - { - tmp = a[j]; - a[j] = a[j+1]; - a[j+1] = tmp; - } - } + for (int i = 0; i < length-1; ++i) // 第i轮排序 + { + for (int j = 0; j < length-i; ++j) + { + if (a[j] > a[j+1]) + { + tmp = a[j]; + a[j] = a[j+1]; + a[j+1] = tmp; + } + } - } + } } @@ -82,45 +82,45 @@ void bubble_sort(int *a, int length){ // 挖坑填数,2边向中间扫描 int partion(int *a, int start,int end){ - int i=start,j=end; - int tmp = a[i]; // 这里要做越界检查 + int i=start,j=end; + int tmp = a[i]; // 这里要做越界检查 - while(i=tmp){ - j--; - } - if (i=tmp){ + j--; + } + if (i= a[max])// parent > parent >= max(left, right) - { - break; - } - else - { - heap_swop(&a[parent],&a[max]); + // 和最大孩子比 + if (a[parent] >= a[max])// parent > parent >= max(left, right) + { + break; + } + else + { + heap_swop(&a[parent],&a[max]); parent = max; //继续向下, 比对, 交换, 保证所有树 父节点 >= 子节点 max = 2 * parent + 1; - } + } - } + } } @@ -168,35 +168,35 @@ void heap_public_adjust(int *a,int parent,int length){ //反之,把最小的孩子换上来就是创建最小堆 一直到a[0] void heap_build(int *a,int length){ - - for (int i = (length-2)/2; i >=0 ; --i) - { - // 三个数里取最大的一个 a[i],a[2i+1],a[2i+2],跟a[i]交换;然后是 a[(i-1)/2],a[i],a[i+1] .. 一直到a[0] - heap_public_adjust(a,i,length); - - } + + for (int i = (length-2)/2; i >=0 ; --i) + { + // 三个数里取最大的一个 a[i],a[2i+1],a[2i+2],跟a[i]交换;然后是 a[(i-1)/2],a[i],a[i+1] .. 一直到a[0] + heap_public_adjust(a,i,length); + + } } // 自顶向下调整 void heap_adjust(int *a,int length){ - heap_public_adjust(a,0,length); //对0号调整 + heap_public_adjust(a,0,length); //对0号调整 } void heap_sort(int *a, int length){ - // 建立堆 大根堆,递增排序 - heap_build(a,length); + // 建立堆 大根堆,递增排序 + heap_build(a,length); - for (int i = length-1; i >0; --i) - { - //交换 - heap_swop(&a[0],&a[i]); - //调整 - heap_adjust(a,i); - } + for (int i = length-1; i >0; --i) + { + //交换 + heap_swop(&a[0],&a[i]); + //调整 + heap_adjust(a,i); + } } @@ -208,31 +208,31 @@ void heap_sort(int *a, int length){ void merge_array(int *a,int size_a,int *b, int size_b){ - int *tmp = malloc( (size_a+size_b)*sizeof(int) ); - int i,j,k; - i=j=k=0; + int *tmp = malloc( (size_a+size_b)*sizeof(int) ); + int i,j,k; + i=j=k=0; - while(ib[j])?b[j++]:a[i++]; - } + tmp[k++] = (a[i]>b[j])?b[j++]:a[i++]; + } - while(i1) - { - - merge_sort(a,length/2); - merge_sort(a+length/2,length-length/2); + if (length>1) + { + + merge_sort(a,length/2); + merge_sort(a+length/2,length-length/2); - merge_array(a,length/2,a+length/2,length-length/2); - } + merge_array(a,length/2,a+length/2,length-length/2); + } @@ -261,35 +261,35 @@ void merge_sort(int *a, int length){ int main(){ - //int a[] = {4,87,2,32,5,2,9,49,49,23,45,2,41}; - //准备5000个数 - int a[Max_Number]; - for (int i = 0; i < Max_Number; ++i) - { - a[i]=rand()%Max_Number; - } + //int a[] = {4,87,2,32,5,2,9,49,49,23,45,2,41}; + //准备5000个数 + int a[Max_Number]; + for (int i = 0; i < Max_Number; ++i) + { + a[i]=rand()%Max_Number; + } - clock_t start,finish; + clock_t start,finish; - + - start = clock(); - //merge_sort(a,sizeof(a)/sizeof(int)); // 0.002s,可以看到,归并排序还是很快的 - heap_sort(a,sizeof(a)/sizeof(int)); // 有buggggggg - //quicksort(a,0,sizeof(a)/sizeof(int)-1); // 0.01s - //insert_sort(a,sizeof(a)/sizeof(int)); // 3.85s - //select_sort(a,sizeof(a)/sizeof(int)); // 5.3s - //bubble_sort(a,sizeof(a)/sizeof(int)); // 12.5s - finish = clock(); + start = clock(); + //merge_sort(a,sizeof(a)/sizeof(int)); // 0.002s,可以看到,归并排序还是很快的 + heap_sort(a,sizeof(a)/sizeof(int)); // + //quicksort(a,0,sizeof(a)/sizeof(int)-1); // 0.01s + //insert_sort(a,sizeof(a)/sizeof(int)); // 3.85s + //select_sort(a,sizeof(a)/sizeof(int)); // 5.3s + //bubble_sort(a,sizeof(a)/sizeof(int)); // 12.5s + finish = clock(); - printf("after sort:\n"); - for (int i = 0; i < sizeof(a)/sizeof(int); ++i) - { - printf(" %d ",a[i]); - } - printf("time eclipse: %.6f sec\n", (double)(finish-start)/CLOCKS_PER_SEC); // CLOCKS_PER_SEC 1000 clock()是毫秒 + printf("after sort:\n"); + for (int i = 0; i < sizeof(a)/sizeof(int); ++i) + { + printf(" %d ",a[i]); + } + printf("time eclipse: %.6f sec\n", (double)(finish-start)/CLOCKS_PER_SEC); // CLOCKS_PER_SEC 1000 clock()是毫秒 - return 0; + return 0; }