1. 直接插入排序
2. 折半插入排序
3. 冒泡排序
4. 簡單選擇排序
5. 希爾排序
6. 快速排序
7. 堆排序
8. 二路歸並排序
[cpp] // Sort.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
#include "iostream"
using namespace std;
// Straight insert sort
void InsertSort(int *arr,int length);
void InsertSort2(int arr[], int length);
// Binary Insert Sort
void BinInsertSort(int arr[], int length);
// Shell Sort
void ShellSort(int *arr,int length);
// Shell Sort 2
void ShellSort2(int *arr,int length);
// Bubble Sort
void BubbleSort(int *arr,int length);
// Quick Sort
void QuickSort(int *arr, int low, int high);
// Partition
int Partition(int *arr, int low, int high);
// Simple Selection Sort
void SimpleSelectionSort(int *arr, int length);
// HeapAdjust
void HeapAdjust(int *arr, int s,int end);
// Heap Sort,小根堆
void HeapSort(int *arr,int length);
// Merge Array
void Merge(int *arr, int *arr2, int left, int mid, int right);
// Merge Sort
void MergeSort(int *arr, int *arr2, int left, int right);
int _tmain(int argc, _TCHAR* argv[])
{
int arr[]={29,5,44,28,36,42,7,5,88,9,10};
int length=sizeof(arr)/sizeof(*arr);
InsertSort(arr,length);
printf("Straight Insert Sort:\n");
printf("total number:%4d\n",length);
printf("sorted result:\n");
for (int i=0;i<length;i++)
{
printf("%5d",arr[i]);
}
cout<<endl;
// test2
int arr2[]={29,5,44,28,36,42,7,5,88,9,10};
length=sizeof(arr2)/sizeof(*arr2);
InsertSort2(arr2,length);
printf("Straight Insert Sort:\n");
printf("total number:%4d\n",length);
printf("sorted result:\n");
for (int i=0;i<length;i++)
{
printf("%5d",arr2[i]);
}
cout<<endl;
// test3
int arr3[]={29,5,44,28,36,42,7,5,88,9,10};
length=sizeof(arr3)/sizeof(*arr3);
BinInsertSort(arr3,length);
printf("Binary Insert Sort:\n");
printf("total number:%4d\n",length);
printf("sorted result:\n");
for (int i=0;i<length;i++)
{
printf("%5d",arr3[i]);
}
cout<<endl;
// test4
int arr4[]={29,5,44,28,36,42,7,5,88,9,10};
length=sizeof(arr4)/sizeof(*arr4);
ShellSort(arr4,length);
printf("Shell Sort:\n");
printf("total number:%4d\n",length);
printf("sorted result:\n");
for (int i=0;i<length;i++)
{
printf("%5d",arr4[i]);
}
cout<<endl;
// test5
int arr5[]={29,5,44,28,36,42,7,5,88,9,10};
length=sizeof(arr5)/sizeof(*arr5);
ShellSort2(arr5,length);
printf("Shell Sort 2:\n");
printf("total number:%4d\n",length);
printf("sorted result:\n");
for (int i=0;i<length;i++)
{
printf("%5d",arr5[i]);
}
cout<<endl;
// test6
int arr6[]={29,5,44,28,36,42,7,5,88,9,10};
length=sizeof(arr6)/sizeof(*arr6);
BubbleSort(arr6,length);
printf("Bubble Sort:\n");
printf("total number:%4d\n",length);
printf("sorted result:\n");
for (int i=0;i<length;i++)
{
printf("%5d",arr6[i]);
}
cout<<endl;
// test7
int arr7[]={29,5,44,28,36,42,7,5,88,9,10};
length=sizeof(arr7)/sizeof(*arr7);
QuickSort(arr7,0,length-1);
printf("Quick Sort:\n");
printf("total number:%4d\n",length);
printf("sorted result:\n");
for (int i=0;i<length;i++)
{
printf("%5d",arr7[i]);
}
cout<<endl;
// test8
int arr8[]={29,5,44,28,36,42,7,5,88,9,10};
length=sizeof(arr8)/sizeof(*arr8);
SimpleSelectionSort(arr8,length);
printf("Simple Selection Sort:\n");
printf("total number:%4d\n",length);
printf("sorted result:\n");
for (int i=0;i<length;i++)
{
printf("%5d",arr8[i]);
}
cout<<endl;
// test9, 對於堆的應用,數組arr[0]暫時不用,降低處理復雜度
int arr9[]={0,29,5,44,28,36,42,7,5,88,9,10};
length=sizeof(arr9)/sizeof(*arr9)-1;
HeapSort(arr9,length);
printf("///////////////////////////////////////////////////////////////////////\n");
printf("Heap Sort:\n");
printf("total number:%4d\n",length);
printf("sorted result:\n");
for (int i=length;i>=1;i--)
{
printf("%5d",arr9[i]);
}
cout<<endl;
// test10
int arr10[]={29,5,44,28,36,42,7,5,88,9,10};
length=sizeof(arr10)/sizeof(*arr10);
int * arr10_2=new int[length];
MergeSort(arr10,arr10_2,0,length-1);
printf("///////////////////////////////////////////////////////////////////////\n");
printf("Merge Sort:\n");
printf("total number:%4d\n",length);
printf("sorted result:\n");
for (int i=0;i<length;i++)
{
printf("%5d",arr10[i]);
}
cout<<endl;
system("pause");
return 0;
}
// 由小到大排序
// Straight Insert Sort
void InsertSort(int *arr,int length)
{
for (int i=1;i<length;i++)
{
if (arr[i]<arr[i-1]) // 需要將arr[i]插入到已排序的列表中
{
int temp=arr[i];
int j=0;
for (j=i-1;j>=0;j--)
{
if (temp<arr[j])
{
arr[j+1]=arr[j];
}
else
{
break;
}
}
arr[j+1]=temp;
}
}
}
// Straight Insert Sort 2
void InsertSort2(int arr[], int length)
{
for (int i=1;i<length;i++)
{
if (arr[i]<arr[i-1]) // 需要進行插入
{
int temp=arr[i];
int j=i-1;
do
{
arr[j+1]=arr[j];
j--;
} while (j>=0&&temp<arr[j]);
arr[j+1]=temp;
}
}
}
// Binary Insert Sort
void BinInsertSort(int arr[], int length)
{
for (int i=1;i<length;i++)
{
if (arr[i]<arr[i-1]) // 需要插入到有序序列中
{
int temp=arr[i];
int low=0;
int high=i-1;
while(low<=high)
{
int mid=(low+high)/2;
if (temp<mid)
{
high=mid-1;
}
else if (temp>mid)
{
low=mid+1;
}
else
{
low=mid+1;
break;
}
}
for(int j=i-1;j>=low;j--)
{
arr[j+1]=arr[j];
}
arr[low]=temp;
}
}
}
// Shell Sort
void ShellSort(int *arr,int length)
{
// Shell Sort
int gap=length; // 初始化子序列的間隔
do
{
gap=gap/3+1;
for (int i=0+gap;i<length;i++) //判斷每個子序列
{
if (arr[i]<arr[i-gap]) // 需要插入到已排序的子序列
{
int temp=arr[i];
int j=0;
for (j=i-gap;j>=0;j=j-gap)
{
if (temp<arr[j])
{
arr[j+gap]=arr[j];
}
else
{
break;
}
}
arr[j+gap]=temp;
}
}
} while (gap>1);
}
// Shell Sort 2
void ShellSort2(int *arr,int length)
{
int gap=length;
do
{
gap=gap/3+1;
for (int i=0+gap;i<length;i++)
{
if (arr[i]<arr[i-gap])
{
int temp=arr[i];
int j=i-gap;
do
{
arr[j+gap]=arr[j];
j=j-gap;
} while (j>=0&&temp<arr[j]);
arr[j+gap]=temp;
}
}
} while (gap>1);
}
// Bubble Sort
void BubbleSort(int *arr,int length)
{
bool exchange=false;
for (int i=0;i<length-1;i++)
{
exchange=false;
for (int j=length-1;j>=i+1;j--)
{
if (arr[j]<arr[j-1]) // 需要交換
{
exchange=true;
int temp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=temp;
}
}
if (exchange==false)
{
return;
}
}
}
// Quick Sort
void QuickSort(int *arr, int low, int high)
{
if (low<high)
{
int pivocLoc=Partition(arr,low,high);
QuickSort(arr,low,pivocLoc-1);
QuickSort(arr,pivocLoc+1,high);
}
}
// Partition
int Partition(int *arr, int low, int high)
{
int pivotKey=arr[low]; // 記錄樞軸
while(low<high)
{
while(low<high&&arr[high]>=pivotKey) --high;
int temp=arr[high];arr[high]=arr[low];arr[low]=temp;
while(low<high&&arr[low]<pivotKey) ++low;
temp=arr[high];arr[high]=arr[low];arr[low]=temp;
}
return low;
}
// Simple Selection Sort
void SimpleSelectionSort(int *arr, int length)
{
//
for (int i=0;i<length;i++)
{
int index=i;
for(int j=i+1;j<length;j++)
{
if (arr[j]<arr[index])
{
index=j;
}
}
if(index!=i)
{
// exchange
int temp=arr[i];
arr[i]=arr[index];
arr[index]=temp;
}
}
}
// Heap Sort,小根堆
void HeapSort(int *arr,int length)
{
// 調整數組生成小根堆
for (int i=length/2;i>=1;i--)
{
HeapAdjust(arr,i,length);
}
for (int i=length;i>1;--i)
{
// 交換堆頭的元素和最後一個
int temp=arr[1];
arr[1]=arr[i];
arr[i]=temp;
// 重新調整堆為小根堆
HeapAdjust(arr,1,i-1);
}
}
// HeapAdjust
void HeapAdjust(int *arr, int s,int end)
{
int rloc=arr[s];
for (int j=2*s;j<=end;j=j*2)
{
if (j<end&&arr[j]>arr[j+1])
{
j++; // 找到兩個兄弟節點中最小的節點
}
if (!(arr[j]<rloc))
{
break;
}
arr[s]=arr[j];
s=j;
}
arr[s]=rloc;
}
// Merge Sort
void MergeSort(int *arr, int *arr2, int left, int right)
{
if (left==right)
{
arr2[left]=arr[left];
return;
}
if (left<right)
{
int mid=(left+right)/2;
MergeSort(arr,arr2,left,mid);
MergeSort(arr,arr2,mid+1,right);
Merge(arr,arr2,left,mid,right);
}
}
// Merge Array
void Merge(int *arr, int *arr2, int left, int mid, int right)
{
// 將數組保存到暫存空間中
for (int k=left;k<=right;k++)
{
arr2[k]=arr[k];
}
int s1=left;
int s2=mid+1;
int t=left;
while(s1<=mid&&s2<=right)
{
if (arr2[s1]<=arr2[s2])
{
arr[t++]=arr2[s1++];
}
else
{
arr[t++]=arr2[s2++];
}
}
while(s1<=mid) arr[t++]=arr2[s1++];
while(s2<=right) arr[t++]=arr2[s2++];
}
// Sort.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
#include "iostream"
using namespace std;
// Straight insert sort
void InsertSort(int *arr,int length);
void InsertSort2(int arr[], int length);
// Binary Insert Sort
void BinInsertSort(int arr[], int length);
// Shell Sort
void ShellSort(int *arr,int length);
// Shell Sort 2
void ShellSort2(int *arr,int length);
// Bubble Sort
void BubbleSort(int *arr,int length);
// Quick Sort
void QuickSort(int *arr, int low, int high);
// Partition
int Partition(int *arr, int low, int high);
// Simple Selection Sort
void SimpleSelectionSort(int *arr, int length);
// HeapAdjust
void HeapAdjust(int *arr, int s,int end);
// Heap Sort,小根堆
void HeapSort(int *arr,int length);
// Merge Array
void Merge(int *arr, int *arr2, int left, int mid, int right);
// Merge Sort
void MergeSort(int *arr, int *arr2, int left, int right);
int _tmain(int argc, _TCHAR* argv[])
{
int arr[]={29,5,44,28,36,42,7,5,88,9,10};
int length=sizeof(arr)/sizeof(*arr);
InsertSort(arr,length);
printf("Straight Insert Sort:\n");
printf("total number:%4d\n",length);
printf("sorted result:\n");
for (int i=0;i<length;i++)
{
printf("%5d",arr[i]);
}
cout<<endl;
// test2
int arr2[]={29,5,44,28,36,42,7,5,88,9,10};
length=sizeof(arr2)/sizeof(*arr2);
InsertSort2(arr2,length);
printf("Straight Insert Sort:\n");
printf("total number:%4d\n",length);
printf("sorted result:\n");
for (int i=0;i<length;i++)
{
printf("%5d",arr2[i]);
}
cout<<endl;
// test3
int arr3[]={29,5,44,28,36,42,7,5,88,9,10};
length=sizeof(arr3)/sizeof(*arr3);
BinInsertSort(arr3,length);
printf("Binary Insert Sort:\n");
printf("total number:%4d\n",length);
printf("sorted result:\n");
for (int i=0;i<length;i++)
{
printf("%5d",arr3[i]);
}
cout<<endl;
// test4
int arr4[]={29,5,44,28,36,42,7,5,88,9,10};
length=sizeof(arr4)/sizeof(*arr4);
ShellSort(arr4,length);
printf("Shell Sort:\n");
printf("total number:%4d\n",length);
printf("sorted result:\n");
for (int i=0;i<length;i++)
{
printf("%5d",arr4[i]);
}
cout<<endl;
// test5
int arr5[]={29,5,44,28,36,42,7,5,88,9,10};
length=sizeof(arr5)/sizeof(*arr5);
ShellSort2(arr5,length);
printf("Shell Sort 2:\n");
printf("total number:%4d\n",length);
printf("sorted result:\n");
for (int i=0;i<length;i++)
{
printf("%5d",arr5[i]);
}
cout<<endl;
// test6
int arr6[]={29,5,44,28,36,42,7,5,88,9,10};
length=sizeof(arr6)/sizeof(*arr6);
BubbleSort(arr6,length);
printf("Bubble Sort:\n");
printf("total number:%4d\n",length);
printf("sorted result:\n");
for (int i=0;i<length;i++)
{
printf("%5d",arr6[i]);
}
cout<<endl;
// test7
int arr7[]={29,5,44,28,36,42,7,5,88,9,10};
length=sizeof(arr7)/sizeof(*arr7);
QuickSort(arr7,0,length-1);
printf("Quick Sort:\n");
printf("total number:%4d\n",length);
printf("sorted result:\n");
for (int i=0;i<length;i++)
{
printf("%5d",arr7[i]);
}
cout<<endl;
// test8
int arr8[]={29,5,44,28,36,42,7,5,88,9,10};
length=sizeof(arr8)/sizeof(*arr8);
SimpleSelectionSort(arr8,length);
printf("Simple Selection Sort:\n");
printf("total number:%4d\n",length);
printf("sorted result:\n");
for (int i=0;i<length;i++)
{
printf("%5d",arr8[i]);
}
cout<<endl;
// test9, 對於堆的應用,數組arr[0]暫時不用,降低處理復雜度
int arr9[]={0,29,5,44,28,36,42,7,5,88,9,10};
length=sizeof(arr9)/sizeof(*arr9)-1;
HeapSort(arr9,length);
printf("///////////////////////////////////////////////////////////////////////\n");
printf("Heap Sort:\n");
printf("total number:%4d\n",length);
printf("sorted result:\n");
for (int i=length;i>=1;i--)
{
printf("%5d",arr9[i]);
}
cout<<endl;
// test10
int arr10[]={29,5,44,28,36,42,7,5,88,9,10};
length=sizeof(arr10)/sizeof(*arr10);
int * arr10_2=new int[length];
MergeSort(arr10,arr10_2,0,length-1);
printf("///////////////////////////////////////////////////////////////////////\n");
printf("Merge Sort:\n");
printf("total number:%4d\n",length);
printf("sorted result:\n");
for (int i=0;i<length;i++)
{
printf("%5d",arr10[i]);
}
cout<<endl;
system("pause");
return 0;
}
// 由小到大排序
// Straight Insert Sort
void InsertSort(int *arr,int length)
{
for (int i=1;i<length;i++)
{
if (arr[i]<arr[i-1]) // 需要將arr[i]插入到已排序的列表中
{
int temp=arr[i];
int j=0;
for (j=i-1;j>=0;j--)
{
if (temp<arr[j])
{
arr[j+1]=arr[j];
}
else
{
break;
}
}
arr[j+1]=temp;
}
}
}
// Straight Insert Sort 2
void InsertSort2(int arr[], int length)
{
for (int i=1;i<length;i++)
{
if (arr[i]<arr[i-1]) // 需要進行插入
{
int temp=arr[i];
int j=i-1;
do
{
arr[j+1]=arr[j];
j--;
} while (j>=0&&temp<arr[j]);
arr[j+1]=temp;
}
}
}
// Binary Insert Sort
void BinInsertSort(int arr[], int length)
{
for (int i=1;i<length;i++)
{
if (arr[i]<arr[i-1]) // 需要插入到有序序列中
{
int temp=arr[i];
int low=0;
int high=i-1;
while(low<=high)
{
int mid=(low+high)/2;
if (temp<mid)
{
high=mid-1;
}
else if (temp>mid)
{
low=mid+1;
}
else
{
low=mid+1;
break;
}
}
for(int j=i-1;j>=low;j--)
{
arr[j+1]=arr[j];
}
arr[low]=temp;
}
}
}
// Shell Sort
void ShellSort(int *arr,int length)
{
// Shell Sort
int gap=length; // 初始化子序列的間隔
do
{
gap=gap/3+1;
for (int i=0+gap;i<length;i++) //判斷每個子序列
{
if (arr[i]<arr[i-gap]) // 需要插入到已排序的子序列
{
int temp=arr[i];
int j=0;
for (j=i-gap;j>=0;j=j-gap)
{
if (temp<arr[j])
{
arr[j+gap]=arr[j];
}
else
{
break;
}
}
arr[j+gap]=temp;
}
}
} while (gap>1);
}
// Shell Sort 2
void ShellSort2(int *arr,int length)
{
int gap=length;
do
{
gap=gap/3+1;
for (int i=0+gap;i<length;i++)
{
if (arr[i]<arr[i-gap])
{
int temp=arr[i];
int j=i-gap;
do
{
arr[j+gap]=arr[j];
j=j-gap;
} while (j>=0&&temp<arr[j]);
arr[j+gap]=temp;
}
}
} while (gap>1);
}
// Bubble Sort
void BubbleSort(int *arr,int length)
{
bool exchange=false;
for (int i=0;i<length-1;i++)
{
exchange=false;
for (int j=length-1;j>=i+1;j--)
{
if (arr[j]<arr[j-1]) // 需要交換
{
exchange=true;
int temp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=temp;
}
}
if (exchange==false)
{
return;
}
}
}
// Quick Sort
void QuickSort(int *arr, int low, int high)
{
if (low<high)
{
int pivocLoc=Partition(arr,low,high);
QuickSort(arr,low,pivocLoc-1);
QuickSort(arr,pivocLoc+1,high);
}
}
// Partition
int Partition(int *arr, int low, int high)
{
int pivotKey=arr[low]; // 記錄樞軸
while(low<high)
{
while(low<high&&arr[high]>=pivotKey) --high;
int temp=arr[high];arr[high]=arr[low];arr[low]=temp;
while(low<high&&arr[low]<pivotKey) ++low;
temp=arr[high];arr[high]=arr[low];arr[low]=temp;
}
return low;
}
// Simple Selection Sort
void SimpleSelectionSort(int *arr, int length)
{
//
for (int i=0;i<length;i++)
{
int index=i;
for(int j=i+1;j<length;j++)
{
if (arr[j]<arr[index])
{
index=j;
}
}
if(index!=i)
{
// exchange
int temp=arr[i];
arr[i]=arr[index];
arr[index]=temp;
}
}
}
// Heap Sort,小根堆
void HeapSort(int *arr,int length)
{
// 調整數組生成小根堆
for (int i=length/2;i>=1;i--)
{
HeapAdjust(arr,i,length);
}
for (int i=length;i>1;--i)
{
// 交換堆頭的元素和最後一個
int temp=arr[1];
arr[1]=arr[i];
arr[i]=temp;
// 重新調整堆為小根堆
HeapAdjust(arr,1,i-1);
}
}
// HeapAdjust
void HeapAdjust(int *arr, int s,int end)
{
int rloc=arr[s];
for (int j=2*s;j<=end;j=j*2)
{
if (j<end&&arr[j]>arr[j+1])
{
j++; // 找到兩個兄弟節點中最小的節點
}
if (!(arr[j]<rloc))
{
break;
}
arr[s]=arr[j];
s=j;
}
arr[s]=rloc;
}
// Merge Sort
void MergeSort(int *arr, int *arr2, int left, int right)
{
if (left==right)
{
arr2[left]=arr[left];
return;
}
if (left<right)
{
int mid=(left+right)/2;
MergeSort(arr,arr2,left,mid);
MergeSort(arr,arr2,mid+1,right);
Merge(arr,arr2,left,mid,right);
}
}
// Merge Array
void Merge(int *arr, int *arr2, int left, int mid, int right)
{
// 將數組保存到暫存空間中
for (int k=left;k<=right;k++)
{
arr2[k]=arr[k];
}
int s1=left;
int s2=mid+1;
int t=left;
while(s1<=mid&&s2<=right)
{
if (arr2[s1]<=arr2[s2])
{
arr[t++]=arr2[s1++];
}
else
{
arr[t++]=arr2[s2++];
}
}
while(s1<=mid) arr[t++]=arr2[s1++];
while(s2<=right) arr[t++]=arr2[s2++];
}