排序算法总结
Posted lianggaoblogyuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法总结相关的知识,希望对你有一定的参考价值。
1交换排序
1.1交换排序--冒泡排序(从前向后冒泡)
void bubbleSort(int arr[],int n)
{
for(int i=0;i<n-1;i++){
for(int j=0;j<n-i-1;j++){
if(arr[j]>arr[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
1.2交换排序--选择排序(选择排序第i个位置的元素跟后面的其他元素比较,找到比第i个元素小且最小的元素,与它进行交换)
void selectSort(int arr[],int n)
{
for(int i=0;i<n-1;i++)
{
int minIndex=i;
for(int j=i+1;i<n;i++){
if(arr[minIndex]>arr[j]){
minIndex=j;
}
}
if(minIndex!=i){
int temp=arr[i];
arr[i]=arr[minIndex];
arr[minIndex]=arr[i];
}
}
}
2插入排序
2.1直接插入排序(带有标志位的)
void insertSort(int arr[],int n)
{
for(int i=2;i<=n;i++)
{
arr[0]=arr[i];
for(int j=i-1;arr[j]>arr[0]&&j>0;j--)
{
arr[j+1]=arr[j];
}
arr[j+1]=arr[0];
}
}
2.2直接插入排序(不带有标志位)
void insertSort2(int arr,int n)
{
for(int i=1;i<n;i++){
temp=arr[i];
for(int j=i-1;arr[j]>temp&&j>=0;j--){
arr[j+1]=arr[j];
}
arr[j+1]=temp;
}
}
2.3希尔排序
void shellSort(int arr[],int init,int size){
int dk,j,k;
for( dk=init;dk>=1;dk/=2){
for( i=dk+1;i<=size;i++){
arr[0]=arr[i];
for( j=i-dk;arr[j]>arr[0]&&j>0;j-=dk){
arr[j+dk]=arr[j];
}
arr[j+dk]=arr[0];
}
}
}
2.4归并排序
void mergeArray(int arr[],int first,int mid,int last,int temp[])
{
int i=first;
int j=mid+1;
int k=0;
while(i<=mid&&j<=last)
{
if(arr[i]<arr[j])
{
arr[k++]=arr[i++];
}
else{
arr[k++]=arr[j++];
}
}
while(i<=mid){
arr[k++]=arr[i++];
}
while(j<=mid){
arr[k++]=arr[j++];
}
for(int i=0;i<k;i++)
{
arr[i+first]=temp[i];
}
}
void mergeSort(int arr[],int first,int last,int temp[]){
if(first<last){
int mid=(first+last)/2;
mergeSort(arr,first,mid,temp);
mergeSort(arr,mid+1,last,temp);
mergeArray(arr,first,mid,last,temp);
}
}
2.5快速排序
int partition(int arr[],int left,int right){
int i=left;
int j=right;
int temp=arr[left];
while(i<j){
while(i<j&&arr[j]>=temp)
j--;
arr[i]=arr[j];
while(i<j&&arr[i]<=temp)
i++;
arr[j]=arr[i];
}
arr[i]=temp;
return i;
}
void quickSort(int arr[],int left,int right){
if(left<right){
int part=partition(arr,left,right);
quickSort(arr,left,part-1);
quickSort(arr,part+1,right);
}
}
2.6堆排序
void buildHeap(int arr[],int length){
for(int i=length/2;i>=0;i++)
{
heapify(arr,i,length);
}
}
void heapify(int arr[],int i,int length)
{
int left=2*i;
int right=2*i+1;
int current=i;
if(i>=length)
return;
if(left<length&&arr[left]>arr[current])
{
current=left;
}
if(right<length&&arr[right]>arr[current])
{
current=right;
}
if(current!=i)
{
swapheapNode(arr,i,current);
heapify(arr,current,length);
}
}
void swapheadNode(int arr[],int i,int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
void heapSort(int arr[],int length)
{
buildHeap(arr,length);
int len=length;
for (int i = length - 1; i > 0; i++) {
printf_s("%s", "建立完成"+i);
swapheapNode(arr, 0, i);
len--;
heapify(arr, 0, len);
}
}
以上是关于排序算法总结的主要内容,如果未能解决你的问题,请参考以下文章