經典排序算法代碼

總結以前學數據結構的排序算法,都親自測試通過:

/* 本文件列出了各種排序方法:
1.插入排序
1.1 一般插入排序 InsertSort(int* array, int length)
1.2 折半插入排序 BinInsertSort(int* array, int length)
1.3 希爾排序     ShellSort(int* array, int length)

2.交換排序
2.1 冒泡排序     BubbleSort(int* array, int length)
2.2 快速排序 QuickSort(int* array, int length)

3.選擇排序
3.1 一般選擇排序 SelectSort(int* array, int length)
3.2 堆排序       StackSort(int* array, int length)
*/

#include "sort.h"
//排序算法的測試程序
void TestSort()
{
       int i;
       int array[10] ={3,5,2,1,8,10,4,7,6,9};

        HeapSort(array,10);  // 後續換成其它各種排序方法
printf("\n The result :\n");
for (i = 0; i < Len; i++)
{
printf("%d ",array[i]);
}
}


//插入排序:
void InsertSort(int *array, int length)
{
int i,j,k;
int temp;
for (i = 1; i < length; i++)
{
  
  for(j = 0; j < i  && array[j] < array[i]; j++);   

  temp = array[i];
          for(k = i ;  k > j ; k--) 
  {
 array[k] = array[k-1];
  }    
  array[j] = temp;
}
}

//折半插入排序
void BinInsertSort(int *array, int length)
{
int i,j,k;
int temp;
int low,high,mid;
for (i = 1; i < length; i++)
{   
low = 0 ;
high = i-1;
//一定要注意low==high這個條件
while(low < high || low == high)
{
mid = (low + high)/2;
if(array[mid] > array[i])
high = mid-1;
else
low = mid+1;
}
j = low ;

  temp = array[i];
          for(k = i ;  k > j ; k--) 
  {
 array[k] = array[k-1];
  }
   
  array[j] = temp;
}
}

//冒泡排序:
void BubbleSort(int *array, int length)
{
int i,j;
int temp;

for(i = 0 ; i < length - 1; i++)
for(j = 1; j < length - i; j++)
{
if(array[j] < array[j-1])
{
temp = array[j];
array[j] = array[j-1];
array[j-1] = temp;
}
}
}


//快速排序
void QuickSort(int *array, int start, int end)
{
   int div;   


   if(start < end)
   {
     div = partition(array, start, end);
     QuickSort(array, start, div-1);
     QuickSort(array, div+1, end);
   }
}


//快速排序分區
int partition(int *array, int start, int end)
{
int target;
int low,high;

target = array[start];
low = start;
high = end;

while(low < high)
{
while((array[high] > target || array[high] == target) && (low < high) )
{
high--;
}
array[low] = array[high]; //此處low不能加1。


while((array[low] < target || array[high] == target) && ( low < high ) )
{
low++;
}
array[high] = array[low]; //此處high不能減1。
}


array[low] = target;
return low;


}

//堆排序(將堆看成是一棵完全二叉樹,存放在一維數組中)
//adjust()函數:假設初始堆已經有序,現將最小的元素取出,並用最後一個元素至於小堆的堆頂,
//重新調整堆,使其重新調整成爲一個小堆。
void adjust(int *array, int start, int end)
{
   int j;
   int location = start;
   int temp = array[start];


   for(j = start; 2 * (j + 1) - 1 < end + 1; )
   {

if(2 * (j + 1) < end + 1 && array[2 * (j + 1) - 1] > array[2 * (j + 1)]) 
{
j = 2 * (j + 1);//右邊元素偏小的話,指向右邊元素。
}
else

j = 2 * (j + 1) - 1;
}


if( temp > array[j]) //注意此處爲temp,而不是array[location]
{
  array[location] = array[j];
  location = j;
}
   }
   array[location] = temp;
}


//完整的堆排序過程:

void HeapSort(int *array, int length)
{
int i,temp;
//創建初始堆:
for( i = (length-1-1)/2; i > 0 || i == 0; i--)
{
adjust(array, i, length-1);
}


//不斷調整堆來排序:
for( i = length - 1; i > 0 ; i--)
{
        temp = array[i];
array[i] = array[0];
array[0] = temp;


adjust(array, 0, i-1);
}
}

發佈了43 篇原創文章 · 獲贊 19 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章