各种内部排序
这两天写了一下排序,整理一下。。。
代码比较乱,自己看的,不要拍我。。。
注意:不管怎么样,程序是写出来的!一定要写!你才能知道各种边界啊,小错误啊~
注意:操作数组下标和数组元素的区别!!!
插入排序
1 void insertsort(int *a, int n) 2 { 3 if(a==NULL || n<=0) 4 return; 5 for(int i=1; i<n; i++) 6 { 7 for(int j=i; j>0; j--) 8 { 9 if(a[j]<a[j-1]) 10 swap(&a[j], &a[j-1]); 11 } 12 } 13 }
选择排序
1 void selectsort(int *a, int n) 2 { 3 if(a==NULL || n<=0) 4 return; 5 int min; 6 for(int i=0; i<n; i++) 7 { 8 min = i; 9 for(int j=i+1; j<n; j++) 10 { 11 if(a[j]<a[min]) 12 { 13 min = j; 14 } 15 } 16 swap(&a[min],&a[i]); 17 } 18 }
冒泡排序(跟插入排序有点像。。。)
1 void bubblesort(int a[], int n) 2 { 3 if(a==NULL || n <= 0) 4 return; 5 for(int i=0; i<n; i++) 6 { 7 for(int j=1; j<n-i; j++) 8 { 9 if(a[j]<a[j-1]) 10 swap(&a[j], &a[j-1]); 11 } 12 } 13 }
希尔排序
1 void shellsort(int a[], int n) 2 { 3 if(a==NULL || n<=0) 4 return; 5 int gap = n; 6 int i, j; 7 int temp; 8 while(gap>1) 9 { 10 gap = gap/3+1; 11 for(i=gap; i<n; i++) 12 { 13 if(a[i-gap]>a[i]) 14 { 15 temp = a[i]; 16 for(j=i-gap; j>=0&&temp<a[j]; j-=gap) 17 { 18 a[j+gap] = a[j]; 19 } 20 a[j+gap] = temp; 21 } 22 } 23 } 24 }
快速排序
快排有两种写法,主要是分区函数partition的不同:
一种是两个指针从开头往结尾走,注意区分大于枢纽的元素和小于枢纽的元素;
一种是两个指针分别从开头和结尾往中间走。
A:两个指针从开头往结尾走:
1 int partition(int *a, int m, int n) 2 { 3 //使用头元素、尾元素和中间元素取三数中值作为枢纽 4 int mid = (m+n)/2; 5 if(a[mid]<a[n]) 6 swap(&a[mid], &a[n]); 7 if(a[m]<a[n]) 8 swap(&a[m], &a[n]); 9 if(a[mid]<a[m]) 10 swap(&a[mid], &a[m]); 11 swap(&a[mid], &a[n]); 12 int first_high = m-1; 13 for(int i=m; i<n; i++) 14 { 15 if(a[i]<a[n]) 16 { 17 first_high++; 18 if(first_high!=i) 19 swap(&a[i], &a[first_high]); 20 } 21 } 22 first_high++; 23 swap(&a[first_high], &a[n]); 24 return first_high; 25 }
B:两个指针分别从开头和结尾往中间走:
1 int partition(int a[], int m, int n) 2 { 3 int mid = (m+n)/2; 4 if(a[mid]<a[n]) 5 swap(&a[mid], &a[n]); 6 if(a[m]<a[n]) 7 swap(&a[m], &a[n]); 8 if(a[mid]<a[m]) 9 swap(&a[mid], &a[m]); 10 swap(&a[mid], &a[n]); 11 int i=m; 12 int j=n+1; 13 while(1) 14 { 15 while(a[++i]<a[n]){} 16 while(a[n]<a[--j]){} 17 if(i<j) 18 swap(&a[i], &a[j]); 19 else 20 break; 21 } 22 swap(&a[i], &a[n]); 23 return i; 24 }
1 void quicksort(int a[], int m, int n) 2 { 3 int pivot; 4 if(m<n) 5 { 6 pivot = partition(a, m, n); 7 quicksort(a, m, pivot-1); 8 quicksort(a, pivot+1, n); 9 } 10 }
归并排序
1 void merge(int a[], int b[], int left, int mid, int right) 2 { 3 int i,j,k; 4 i = left; 5 k = left; 6 j = mid+1; 7 while( i<=mid&&j<=right) 8 { if(a[i]<=a[j]) 9 b[k++]=a[i++]; 10 else 11 b[k++]=a[j++]; 12 } 13 while(i<=mid){ 14 b[k++]=a[i++]; 15 } 16 while(j<=right) 17 b[k++]=a[j++];
//此处注意要复制,否则只对原来的数组操作,结果是错误的! 18 for(i=left; i<k; i++) 19 a[i]=b[i]; 20 } 21 void mergesort(int a[], int b[], int left, int right) 22 { 23 if(left<right) 24 { 25 int mid = (left+right)/2; 26 mergesort(a, b, left, mid); 27 mergesort(a, b, mid+1, right); 28 merge(a, b, left, mid, right); 29 } 30 }
堆排序
1 void heapify(int a[], int index, int length) 2 { 3 int left = 2*index+1; 4 int right = 2*index+2; 5 int largest; 6 if(left<length && a[left]>a[index]) 7 largest = left; 8 else 9 largest = index; 10 if(right<length && a[right]>a[largest]) 11 largest = right; 12 if(largest!=index) 13 { 14 swap(&a[largest], &a[index]); 15 heapify(a, largest, length); 16 } 17 } 18 void buildheap(int a[], int n) 19 { 20 for(int i=n/2-1; i>=0; i--) 21 { 22 heapify(a, i, n); 23 } 24 } 25 void heapsort(int a[], int n) 26 { 27 buildheap(a, n); 28 for(int i=n-1; i>=1; i--) 29 { 30 swap(&a[0], &a[i]); 31 heapify(a, 0, i); 32 } 33 }
over!