排序算法複雜度表:
種類 | 最優時間複雜度 | 平均時間複雜度 | 最差時間複雜度 | 空間複雜度 | 穩定性 |
冒泡排序 | O(N) | O(N²) | O(N²) | O(1) | 穩定 |
選擇排序 | O(N) | O(N²) | O(N²) | O(1) | 不穩定 |
插入排序 | O(N) | O(N²) | O(N²) | O(1) | 穩定 |
快速排序 | O(N*log2N) | O(N*log2N) | O(N2) | O(log2n)~O(n) | 不穩定 |
歸併排序 | O(N*log2N) | O(N*log2N) | O(N*log2N) | O(n) | 穩定 |
堆排序 | O(N*log2N) | O(N*log2N) | O(N*log2N) | O(1) | 不穩定 |
希爾排序 | O(N) | O(N) | O(N2) | O(1) | 不穩定 |
1、冒泡排序:比較相鄰的兩個元素大小。
void bubblesort(int arr[],int len)
{
int i,j,tmp,flag=0,k;
if(len<=0||arr==NULL) return ;
for(i=0;i<len;i++)
{
for(j=0;j<len-i-1;j++)
{
flag = 0;
if(arr[j]>arr[j+1])
{
flag = 1;
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
if(flag == 0)
{
break;
}
}
}
2、選擇排序:選擇最大(小)值放在後(前)面。
void selectsort(int arr[],int len)
{
int i,j;
int tmp;
int minindex;
if(len <= 0 || arr == NULL) return ;
for(i=0;i<len-1;i++)
{
minindex = i;
for(j=i+1;j<len;j++)
{
if(arr[minindex] > arr[j])
{
minindex = j;
}
}
//put min head;
tmp = arr[i];
arr[i] = arr[minindex];
arr[minindex] = tmp;
}
}
3、插入排序:將無序數據插入到有序數據。
void insertsort(int arr[],int len)
{
int i,j;
int tmp;
for(i=1;i<len;i++)
{
j = i-1;
tmp = arr[i];
while(arr[j] > tmp && j >= 0)
{
arr[j+1] = arr[j];
j--;
}
arr[j+1] = tmp;
}
}
4、計數排序:數據分配比較密集。
void countsort(int arr[],int len)
{
if(len <= 0 || arr == NULL) return ;
int nmax,nmin;
int i,j=0;
nmax = arr[0];
nmin = arr[0];
for(i=0;i<len;i++)
{
if(arr[i]>nmax)
{
nmax = arr[i];
}
if(arr[i]<nmin)
{
nmin = arr[i];
}
}
int *cnt = NULL;
cnt = (int *)malloc(sizeof(int)*(nmax-nmin+1));
memset(cnt,0,sizeof(int)*(nmax-nmin+1));
for(i=0;i<len;i++)
{
cnt[arr[i]-nmin]++;
}
for(i=0;i<nmax-nmin+1;i++)
{
while(cnt[i] != 0)
{
arr[j] = i + nmin;
j++;
cnt[i]--;
}
}
free(cnt);
cnt = NULL;
}
5、快速排序:確定一個標準值,以標準值爲界將數據分成兩部分,左邊小右邊大,遞歸。
int sort(int arr[],int low ,int high)
{
int tmp;
tmp = arr[low];
while(low < high)
{
while(high > low)
{
if(arr[high] < tmp)
{
arr[low] = arr[high];
low++;
break;
}
high--;
}
while(low < high)
{
if(arr[low] > tmp)
{
arr[high] = arr[low];
high--;
break;
}
low++;
}
}
arr[low] = tmp;
return low;
}
int seg_sort(int arr[],int low,int high)
{
int tmp;
tmp = arr[high];
int flag = low -1 ;
while(low<high)
{
if(arr[low] < arr[high])
{
if(++flag != low)
{
arr[flag] = arr[flag]^arr[low];
arr[low] = arr[flag]^arr[low];
arr[flag] = arr[flag]^arr[low];
}
}
low++;
}
if(++flag != high)
{
arr[flag] = arr[flag]^arr[high];
arr[high] = arr[flag]^arr[high];
arr[flag] = arr[flag]^arr[high];
}
return flag ;
}
void quicksort(int arr[],int low,int high)
{
if(arr == NULL || low >= high) return ;
int nstanderd;
//nstanderd = sort(arr,low,high);
nstanderd = seg_sort(arr,low,high);
quicksort(arr,low,nstanderd-1);
quicksort(arr,nstanderd+1,high);
}
6、歸併排序:
void mergesort(int arr[],int low,int high)
{
if(arr == NULL || low >= high) return ;
//chaifen
int mid ;
mid = low + (high - low)/2;
mergesort(arr,low,mid);
mergesort(arr,mid+1,high);
//hebin
merge(arr,low,high);
}
void merge(int arr[],int low,int high)
{
int begin1;
int begin2;
int end1;
int end2;
int *ptmp = NULL;
ptmp = (int *)malloc(sizeof(int)*(high-low+1));
begin1 = low;
end1 = low+(high-low)/2;
begin2 = end1+1;
end2 = high;
int i = 0;
while(begin1 <= end1 && begin2 <= end2)
{
if(arr[begin1] < arr[begin2])
{
ptmp[i] = arr[begin1];
i++;
begin1++;
}
else
{
ptmp[i] = arr[begin2];
i++;
begin2++;
}
}
//rest
while(begin1 <= end1)
{
ptmp[i] = arr[begin1];
i++;
begin2++;
}
for(i=0;i<high-low+1;i++)
{
arr[low+i] = ptmp[i];
}
free(ptmp);
ptmp = NULL;
}