各种内部排序

这两天写了一下排序,整理一下。。。

代码比较乱,自己看的,不要拍我。。。

注意:不管怎么样,程序是写出来的!一定要写!你才能知道各种边界啊,小错误啊~

注意:操作数组下标和数组元素的区别!!!

插入排序

 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!

posted @ 2012-10-08 17:12  iavailable  阅读(195)  评论(0编辑  收藏  举报