几个常见排序算法的代码实现(复习)

 

#include<stdio.h>

#define ARR_SIZE 20

#include <iostream>

using namespace std;

 

void printArr(int arr[], int count){

       for(int i = 0;i<count;i++){

                    printf("%d ",arr[i]);

       }

       printf("\n");

}

 

// Sort Funs

 

//插入排序

void  InsertionSort( int arr[], size_t count )

{

      if(arr == NULL || count <= 1) return;

       for( int i = 1; i < count; i++ ) //从第二个元素开始

    {

              int tmp = arr[i],j = i;

               for( ; j>0 && arr[j-1]>tmp; j-- ){

                      arr[j] = arr[j-1]; //挪位

               }     

               arr[j] = tmp;

       }

}

 

//选择排序

void SelectSort( int arr[], size_t count)

{

       if(arr == NULL || count <= 1) return;

        for( int i=0; i<count; i++)

        {   

               int min = i;

               for( int j=i; j<count; j++)

                {

                      if( arr[j] < arr[min])

                             min = j;

                }

                int temp = arr[i];

                arr[i] = arr[min];

                arr[min] = temp; 

       }

}

 

//冒泡排序

void BubbleSort( int arr[], size_t count)

{

       if(arr == NULL || count <= 1) return;

        for( int i=0; i<count; i++)

        {   

               for( int j = 1; j < count-i; j++){

                       if( arr[j] < arr[j-1]){

                             int temp = arr[j];

                               arr[j] = arr[j-1];

                               arr[j-1] = temp;

                        }

                } 

       }

}

 

//快速排序

void QuickSort(int arr[], int left, int right)

{

        

         if(arr == NULL || left >= right) return;

          

       int temp = arr[left];

       int i = left, j = right;

       while (i < j) //若条件为i<=j,则将所有判定都加等号则会发生死循环

       {

              while ( i<j && arr[j] > temp )  j--;

                       if(i < j) arr[i++]=arr[j];

           

              while ( i<j && arr[i] < temp )  i++;

              if (i < j) arr[j--] = arr[i];

                    

        }

       arr[i] = temp;

          

       if(i-left > 1)

              QuickSort(arr, left, i-1);

       if(right - i > 1)

              QuickSort(arr, i+1, right);

}

 

//计数排序

void CountingSort(int arr[], int count)

{

      if(arr == NULL || count <= 1) return;

 

       int i, min, max;

      min = max = arr[0];

      for(i = 1; i < count; i++) {

           if (arr[i] < min)

                 min = arr[i];

           else if (arr[i] > max)

                 max = arr[i];

      }

      int range = max - min + 1;

      int *countArr = (int*)malloc(range * sizeof(int));

 

       for(i = 0; i < range; i++)

           countArr[i] = 0;

       for(i = 0; i < count; i++)

           countArr[ arr[i] - min ]++;

 

       int index = 0;

       for(i=0; i<range ;i++){

              int sum = countArr[i];

              while( sum-->0)

                        arr[index++]=i+min;  

       }

 

       free(countArr);

}

 

//堆排序

#define LeftChild(i)  (2*(i)+1)

void  HeapAdjust( int arr[], int i, int N )

//对数组A中以下标为i的元素作为根,大小为N的元素序列构成的堆进行堆调整,使该根节点放到合适的位置

{

      int Child;

       int tmp;

       for( tmp = arr[i]; LeftChild(i) < N; i = Child )

    {

              Child = LeftChild(i);

              if( Child !=N-1 && arr[Child+1] > arr[ Child ] )

                     Child++;  //使Child指向两个子女中大的那一个

              if( tmp < arr[ Child ] )   //大堆

                     arr[i] = arr[Child];

              else

                     break;

     }

       arr[i] =tmp;

}

 

void  Heapsort( int A[], int N )

{

       int i;

       for( i = N/2; i >= 0; i-- )  /* BuildHeap */

              HeapAdjust( A, i, N );

      

       for( i = N-1; i > 0; i-- )

    {

              int temp =  A[0];

              A[0]=A[i];

              A[i]=temp;

              HeapAdjust( A, 0, i );

       }

}

 

 

int main(int argc, char *argv[])

{

    int arr[ARR_SIZE]={1,3,5,7,9,11,13,15,17,19,2,4,6,8,10,12,14,16,18,20};

       //int arr[ARR_SIZE]={10,36,53,72,92,11,13,15,17,19,27,48,69,81,120,112,14,16,18,20};

       //int arr[ARR_SIZE]={1,3,5,4,5,11,11,15,15,16,2,4,6,8,10,12,15,16,15,20};

       printArr(arr,ARR_SIZE);

 

 

      Heapsort(arr,ARR_SIZE);

       printArr(arr,ARR_SIZE);

 

 

 

 

    getchar();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值