1.常見演算法分類
十種常見排序演算法一般分為以下幾種:
(1)非線性時間比較類排序:交換類排序(快速排序和氣泡排序)、插入類排序(簡單插入排序和希爾排序)、選擇類排序(簡單選擇排序和堆排序)、歸併排序(二路歸併排序和多路歸併排序);
(2)線性時間非比較類排序:計數排序、基數排序和桶排序。
總結:(1)在比較類排序中,歸併排序號稱最快,其次是快速排序和堆排序,兩者不相伯仲,但是有一點需要注意,資料初始排序狀態對堆排序不會產生太大的影響,而快速排序卻恰恰相反。
(2)線性時間非比較類排序一般要優於非線性時間比較類排序,但前者對待排序元素的要求較為嚴格,比如計數排序要求待排序數的最大值不能太大,桶排序要求元素按照hash分桶後桶內元素的數量要均勻。線性時間非比較類排序的典型特點是以空間換時間。
注:本博文的示例**均已遞增排序為目的。
2.1交換類排序
2.1.1冒泡類排序
void bubblesort(int *arr,int size)
}if(1 == flag)
}}
2.1.2快速排序
int departition(int *arr,int left ,int right)
arr[left] = tmp;
return left;
}void doquicksort(int *arr,int left,int right)
}void quicksort(int *arr,int size)
2.2 插入類排序
2.2.1直接插入
void insertsort(int *arr,int size)
arr[j] = tmp;
}}
2.2.2 shell排序
void shellsort(int *arr,int size,int d)
arr[k] = tmp;}}
}
2.3選擇類排序
2.3.1直接選擇類排序
void selectsort(int *arr,int size)
if(i != min)
}}
2.3.2 堆排序
void adjustheap(int *arr,int node,int size)
if(tmp < arr[child])
else
}}void heapsort(int *arr,int size)
printf("\n");
*/for(i = 1 ;i < size; i++)
}
2.4歸併排序
void merge(int *src,int *tmp,int begin,int mid,int end)
else
}while(i != mid + 1)
while(j != end + 1)
for(i = begin ; i <= end; i++)
}void mergesort(int *src,int *tmp,int begin,int end)
}
以上是非線性時間比較類排序, 線性時間非比較類排序常見方法如下。
2.5計數排序
void countsort(int *arr,int size)
}tmp = (int *)malloc(sizeof(int)*(max + 1));
if(null == tmp)
memset(tmp,0,sizeof(int)*(max + 1));
for(i = 0 ; i < size ; i++)
count = 0;
for(i = 0;i <= max; i++)
}free(tmp);
tmp = null;
}
2.6 基數排序
int getdigitalpos(int num,int pos)
return (num/mask)%10;
}void distributionsort(int *arr,int size)
; /* 0 ~ 9 */
int i,j;
for(i = 0 ;i < 10; i++)
}buff[i][0] = 0; /* 儲存統計數目 */
}int index,count,k;
for(i = 1; i < max_bit; i++)
/* 將桶中資料裝回原空間 */
count = 0;
for(j = 0; j < 10; j++)
buff[j][0] = 0;}}
/* 釋放桶空間 */
for(i = 0 ;i < 10; i++)
}
2.7 桶排序
struct bucket
;void release(struct bucket **root,int num)
for(i = 0; i < num; i++)
tmp[i] = null;}}
if(tmp)
}void bucketsort(int *arr,int size)
for(i = 0; i < bucket_num; i++)/* bucket_num 桶數目 */
root[i] ->num = 0;
root[i] ->next = null;
root[i] ->val = 0;
}/* 將資料裝入桶中 */
for(i = 0; i < size; i++)
node ->val = arr[i];
node ->next = null;
if(p ->num == 0)
else
(p ->num)++;
}/* 列印 */
for(i = 0; i < bucket_num; i++)
}printf("\n");
release(root,bucket_num);
}
** 十種JAVA排序演算法例項
一 冒泡 bubble 排序 複製 如下 void bubblesortarray 效率 o n 適用於排序小列表。二 選擇排序 複製 如下 void selectsortarray arr j 1 temp 最佳效率o n 最糟效率o n 與冒泡 選擇相同,適用於排序小列表 若列表基本有序,則插入...
js實現十種排序演算法
排序演算法 平均情況 最好情況 最壞情況 空間複雜度 穩定性氣泡排序 o n2 o n o n2 o 1 穩定快速排序 o nlog2n o nlog2n o n2 o log2n o n 不穩定直接插入排序 o n2 o n o n2 o 1 穩定希爾排序 o nlog2n o n2 o n1.3...
十種JAVA排序演算法例項
一 冒泡 bubble 排序 複製 如下 void bubblesortarray 效率 o n 適用於排序小列表。二 選擇排序 複製 如下 void selectsortarray arr j 1 temp 最佳效率o n 最糟效率o n 與冒泡 選擇相同,適用於排序小列表 若列表基本有序,則插入...