生活随笔
收集整理的這篇文章主要介紹了
各类排序算法实现(亲测)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
排序算法通常分為外部排序和內(nèi)部排序,通常所說(shuō)的八類(lèi)排序?qū)儆趦?nèi)部排序;
外部排序在此不說(shuō)明,主要給出八類(lèi)排序的簡(jiǎn)單思想和實(shí)現(xiàn):
1.插入排序
1.1 直接插入排序:
每次將一個(gè)新數(shù),插入到已經(jīng)排列好的有序序列當(dāng)中,新數(shù)作為key值和有序序列中的數(shù)值比較。
代碼實(shí)現(xiàn)
#include <stdio.h>
void main(){
int i,j,key;
int A[
7]={
12,
41,
23,
17,
5,
2,
38};
for(j=
1;j<
7;j++){key=A[j];
for(i=j-
1;i>=
0;i--){
if(A[i]>key){A[i+
1]=A[i];}
else{
break;}}A[i+
1]=key;}
for(i=
0;i<
7;i++){
printf(
"%d-",A[i]);}
} 1.2希爾排序
希爾排序是1959 年由D.L.Shell 提出來(lái)的,相對(duì)直接排序有較大的改進(jìn)。希爾排序又叫縮小增量排序;思想是將待排序的序列分成若干子序列,對(duì)每個(gè)子序列進(jìn)行直接插入排序,當(dāng)序列基本有序時(shí),最后再進(jìn)行一次直接插入排序;增量d取值:d = {n/2 ,n/4, n/8 …..1}
代碼實(shí)現(xiàn):
#include <stdio.h>
#include <iostream>
using namespace std;
void shellInsert(
int a[],
int n,
int dk){
for(
int i=dk;i<n;i++){
if(a[i]<a[i-dk]){
int key = a[i];
int j=i-dk;
while(key<a[j] && j >=
0 ){a[j+dk]=a[j];j-=dk;}a[j+dk]=key;}}
}
void shellSort(
int a[],
int n){
int dk = n/
2;
while (dk >=
1){
cout <<
"dk:"<<dk<<
"\n";shellInsert(a,n,dk);dk=dk/
2;}
for (
int i=
0;i<n;i++){
cout << a[i]<<
",";}
}
int main(){
int a[
13]={
12,
45,
67,
8,
90,
34,
25,
67,
9,
10,
14,
78,
29};shellSort(a,
13);
return 0;
}
2 選擇排序
2.1 簡(jiǎn)單選擇排序
在要排序的一組數(shù)中,選出最小(或者最大)的一個(gè)數(shù)與第1個(gè)位置的數(shù)交換;然后在剩下的數(shù)當(dāng)中再找最小(或者最大)的
與第2個(gè)位置的數(shù)交換,依次類(lèi)推,直到第n-1個(gè)元素(倒數(shù)第二個(gè)數(shù))和第n個(gè)元素(最后一個(gè)數(shù))比較為止。
代碼實(shí)現(xiàn):
#include <iostream>
using
namespace std;
int selectMiniKey(
int a[],
int n,
int b){
int min=b;
for (
int j=b+
1;j<n;++j){
if(a[j]<a[
min]){
min=j;}}
return min;
}
void selectSort(
int a[],
int n){
int min,temp;
for(
int i=
0;i<n;++i){
min=selectMiniKey(a,n,i);
if(i!=
min){temp=a[i];a[i]=a[
min];a[
min]=temp;}}
}
int main(){
int a[
13]={
12,
45,
67,
8,
90,
34,
25,
67,
9,
10,
14,
78,
29};selectSort(a,
13);
for(
int i=
0;i<
13;++i){cout << a[i]<<
",";}
return 1;
}
簡(jiǎn)單選擇排序的改進(jìn)--二元選擇排序
每次同時(shí)挑選出最小的和最大的:
代碼實(shí)現(xiàn):
#include <iostream>
using
namespace std;void selectSort2(
int a[],
int n){
int min,
max,temp;
for(
int i=
1;i<=n/
2;i++){
min=i-
1,
max=i-
1;
for (
int j=i;j<=n-i;j++){
if(a[j]>=a[
max]){
max=j;
continue;}
if(a[j]<=a[
min]){
min=j;}}cout<<a[
min]<<
":"<<a[
max]<<
"\n";
if((i-
1)!=
max){temp=a[i-
1];a[i-
1]=a[
min];a[
min]=temp;temp=a[n-i];a[n-i]=a[
max];a[
max]=temp;}
else{temp=a[n-i];a[n-i]=a[
max];a[
max]=temp;temp=a[i-
1];a[i-
1]=a[
min];a[
min]=temp;}cout<<i<<
":";
for(
int z=
0;z<n;++z)cout<<a[z]<<
",";cout <<
"\n";}}
int main(){
int a[
13]={
12,
45,
67,
8,
90,
34,
25,
67,
9,
10,
14,
78,
29};selectSort2(a,
13);
for(
int i=
0;i<
13;++i){cout << a[i]<<
",";}
return 1;
} 2.2 堆排序
首先將待排序的序列構(gòu)建成一個(gè)大頂堆或者小頂堆;之后將堆頂元素與最后一個(gè)元素交換,選擇出最大或者最小的元素;之后將前面n-1個(gè)元素重新調(diào)整為一個(gè)大頂堆或者小頂堆,重復(fù)上面的過(guò)程,直到選擇出最后一個(gè)元素;堆排序的過(guò)程其實(shí)就分為兩步:一是構(gòu)建堆;二是調(diào)整堆,事實(shí)上構(gòu)建堆的過(guò)程也是通過(guò)調(diào)整堆來(lái)實(shí)現(xiàn)的。
代碼實(shí)現(xiàn):(遞歸實(shí)現(xiàn))
#include<iostream>
using namespace std;
void printHeap(
int a[],
int n){
for(
int i=
0;i<n;++i)
cout<<a[i]<<
",";
cout<<
"\n";
}
void heapAdjust(
int a[],
int s,
int e){
int tmp=a[s];
int child=
2*s+
1;
if(child>=e)
return;
if(child+
1<e && a[child]<a[child+
1]){++child;}
if(a[s]<a[child]){a[s]=a[child];a[child]=tmp;heapAdjust(a,child,e);}
}
void heapBuild(
int a[],
int n){
for(
int i=(n-
1)/
2;i>=
0;--i){heapAdjust(a,i,n);}
}
void heapSort(
int a[],
int n){heapBuild(a,n);printHeap(a,n);
for(
int i=n-
1;i>=
0;--i){
int tmp=a[
0];a[
0]=a[i];a[i]=tmp;heapAdjust(a,
0,i);}
}
int main(){
int a[
13]={
12,
45,
67,
8,
90,
34,
25,
67,
9,
10,
14,
78,
29};heapSort(a,
13);printHeap(a,
13);
return 1;
}
3 交換排序
3.1 冒泡排序
在要排序的一組數(shù)中,對(duì)當(dāng)前還未排好序的范圍內(nèi)的全部數(shù),自上而下對(duì)相鄰的兩個(gè)數(shù)依次進(jìn)行比較和調(diào)整,讓較大的數(shù)往下沉,較小的往上冒。即:每當(dāng)兩相鄰的數(shù)比較后發(fā)現(xiàn)它們的排序與排序要求相反時(shí),就將它們互換。
代碼實(shí)現(xiàn):
#include<iostream>
using namespace std;
void printArray(
int a[],
int n){
for(
int i=
0;i<n;++i)
cout<<a[i]<<
",";
cout<<
"\n";
}
void bubleSort(
int a[],
int n){
for (
int i=
0;i<n;++i){
for(
int j=
0;j<n-i;++j){
if(a[j]>a[j+
1]){
int tmp=a[j];a[j]=a[j+
1];a[j+
1]=tmp;}}}printArray(a,n);
}
int main(){
int a[
13]={
12,
45,
67,
8,
90,
34,
25,
67,
9,
10,
14,
78,
29};bubleSort(a,
13);
return 1;
}
3.2快速排序
思想:選擇一個(gè)基準(zhǔn)元素,通常選擇第一個(gè)元素或者最后一個(gè)元素,通過(guò)一趟排序講待排序的記錄分割成獨(dú)立的兩部分,其中一部分記錄的元素值均比基準(zhǔn)元素值小,另一部分記錄的元素值比基準(zhǔn)值大,此時(shí)基準(zhǔn)元素在其排好序后的正確位置;然后分別對(duì)這兩部分記錄用同樣的方法繼續(xù)進(jìn)行排序,直到整個(gè)序列有序。
代碼實(shí)現(xiàn):
#include<iostream>
using namespace std;
void printArray(
int a[],
int n){
for (
int i=
0;i<n;++i)
cout<<a[i]<<
",";
cout <<
"\n";
}
void swap(
int *a,
int *b){
int tmp=*a;*a=*b;*b=tmp;
}
int partitionKey(
int a[],
int low,
int high){
int key=a[low];
while(low<high){
while(low<high && a[high]>=key)--high;swap(&a[low],&a[high]);
while(low<high && a[low]<=key) ++low;swap(&a[low],&a[high]);}
return low;
}
void quickSort(
int a[],
int low,
int high){
if(low<high){
int key=partitionKey(a,low,high);quickSort(a,low,key-
1);quickSort(a,key+
1,high);}
}
int main(){
int a[
13]={
12,
45,
67,
8,
90,
34,
25,
67,
9,
10,
14,
78,
29};quickSort(a,
0,
12);printArray(a,
13);
return 1;
}
4 歸并排序
思想:將兩個(gè)有序表歸并成一個(gè)有序表;注意是兩個(gè)有序表;對(duì)于一個(gè)待排序列來(lái)說(shuō),可以將代排序列分成若干個(gè)子序列,調(diào)整子序列有序后,再將子序列歸并成一個(gè)更大的有序列,直到序列全部有序。
代碼實(shí)現(xiàn)
#include<iostream>
using namespace std;
void printArray(
int a[],
int n){
for(
int i=
0;i<n;++i)
cout<<a[i]<<
",";
cout<<
"\n";
}
void merge(
int a[],
int b[],
int first,
int mid,
int last){
int k=
0,i=first,j=mid+
1,n=last,m=mid;
while(i<=m && j<=n){
if(a[i]<a[j]){b[k++]=a[i++];}
else{b[k++]=a[j++];}}
while(i<=m) b[k++]=a[i++];
while(j<=n) b[k++]=a[j++];
for(
int s=
0;s<k;s++){a[s+first]=b[s];}}
void mergeSort(
int a[],
int b[],
int s,
int e){
int mid;
if(s==e)
return;mid=(s+e)/
2;mergeSort(a,b,s,mid);
}
void mergeSortRecursive(
int a[],
int n){
int *p =
new int[n];
if(p==NULL)
return;mergeSort(a,p,
0,n-
1);printArray(a,n);
}
int main(){
int a[
13]={
12,
45,
67,
8,
90,
34,
25,
67,
9,
10,
14,
78,
29};mergeSortRecursive(a,
13);
return 1;
}
5 基數(shù)排序
比較簡(jiǎn)單,就不實(shí)現(xiàn)了,感興趣的可以看一下http://blog.csdn.net/hguisu/article/details/7776068這篇博客,講的比較細(xì).
轉(zhuǎn)載于:https://www.cnblogs.com/wesia/p/5747372.html
總結(jié)
以上是生活随笔為你收集整理的各类排序算法实现(亲测)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。