十種排序演算法

2021-08-28 05:38:47 字數 3132 閱讀 4506

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 與冒泡 選擇相同,適用於排序小列表 若列表基本有序,則插入...