排序综合

冒泡排序:

设数组长度为N,

1、比较相邻前后两个数据,数组为[0,N-1],则要比较N-1次

2、循环一次后,最大或者最小的数在数组最后面,这样比较数组[0,N-2],重复上述步骤即可


综上其就是两个for循环

第一个for循环表示:要排序的数值个数-1

第二个for循环表示:将无序数组进行排序,即比较相邻的两个数值


以下为代码:

// sort.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"


void Swap(int &a, int &b)
{
   int temp = a;
   a = b;
   b = temp;
}

void BubbleSort1(int a[], int n)
{
	int i,j;

	for (i = 0; i < n - 1; i++)
	{
		for (j = 0; j < n - i - 1; j++)
		{
			if (a[j] > a[j+1])
			{
				Swap(a[j], a[j+1]);
			}
		}
	}

	 for (int i = 0; i < n; i++)
	 {
		 printf("%d\t", a[i]);
	 }
}

//改进
void BubbleSort2(int a[], int n)
{
	int i, j = n - 1;
	bool flag = true;            //设置标志,如果这一趟发生交换,则为true,否则为false

	while(flag)
	{
		flag = false;
		for(i = 0; i < j; i++)
			if (a[i] > a[i+1])
			{
				Swap(a[i], a[i+1]);;
				flag = true;
			}
		j--;
	}
	
	for (int i = 0; i < n; i++)
	{
		printf("%d\t", a[i]);
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	int score[] = {67, 69, 75, 87, 89, 90, 99, 100};

	BubbleSort2(score, 8);

	return 0;
}

直接插入排序:

设数组为a[0,n-1];

1、取i = 1,2......n-1,每设置一次i的值,即将数组a[0,i-1]进行排序。

2、这样a[0,n-1]可以分为两个部分,a[0,i-1]为排好序的,而a[i,n-1]为无序。

3、i++直到n-1,即1步骤,即可。

以下是代码:

void InsertSort1(int a[], int n)
{
	int i,j,k;
	for (i = 1; i < n; i++)  //将下标1到n-1进行直接插入排序
	{
		for (j = i-1; j >=0; j--)  //当下标为i时,将a[i]排在a[0,i-1]上
		{
			if(a[j] < a[i])
				break;
		}

		if ( j != i-1 )          //如果j不在i的前一位,即表示将a[i]查到a[0,i-1]之间
		{
			int temp = a[i];
			for(k = i - 1; k > j; k--)
				a[k+1]=a[k];
			a[k+1] = temp;
		}
	}
}

//改进直接插入排序
void Insertsort2(int a[], int n)
{
	int i,j;
	for (i = 1; i < n; i++)
		if (a[i] < a[i-1])
		{
			int temp = a[i];
			for (j = i - 1; j >= 0 && a[j] > temp; j--)
			{
				a[j+1] = a[j];
			}
			a[j+1] = temp;
		}
	
	
}

希尔排序:

1、将无序数组分割成若干个子序列,子序列的长度(gap = n/2)是相隔特定的增量子序列,将各子序列进行直接插入排序;

2、在排序一次后,将数组再次分割若干子序列,子序列的长度(gap /= 2)是相隔特定的增量子序列,将各子序列进行直接插入排序;

3、重复上述过程,直到gap = 0时,数组排序完成。


以下为代码:

void shellSort1(int a[], int n)
{
	int i,j,gap; //gap为步长
	for (gap = n/2; gap > 0; gap /= 2) // 设置步长
		for (i = 0; i < gap; i++)      //按组排序
		{
			for (j = i + gap; j < n; j += gap)
			{
				if (a[j] < a[j-gap])  //如果后面的比前面的小
				{
					int temp = a[j];
					int k = j-gap;

					while (k >= 0 && a[k] > temp)
					{
						a[k+gap] = a[k];
						k -= gap;
					}
					a[k+gap] = temp;
				}
			}
		}

}

//改进希尔排序
void shellSort2(int a[], int n)
{
	int j,gap;
	for(gap = n/2; gap > 0; gap /= 2)
		for(j = gap; j < n; j++)   //从数组第gap个元素开始
			if (a[j] < a[j-gap])
			{
				int temp = a[j];
				int k = j-gap;

				while (k >= 0 && a[k] > temp)
				{
					a[k + gap] = a[k];
					k -= gap;
				}

				a[k+gap] = temp;
			}

}

归并排序:

先分,在组合,这里是递归算法

代码如下:

void mergeArray(int a[], int first, int mid, int last, int temp[])
{
	int i = first, j = mid + 1, k = 0;
	int m = mid, n = last;

	while (i <= m && j <= n)
	{
		if(a[i] < a[j])
			temp[k++] = a[i++];
		else
			temp[k++] = a[j++];
	}

	while(i <= m)
		temp[k++] = a[i++];

	while(j <= n)
		temp[k++] = a[j++];

	for (i = 0; i < k; i++)
	{
		a[first + i] = temp[i];

	}
}


void mergesort(int a[], int first, int last, int temp[])
{
	if (first < last)
	{
		int mid = (first + last)/2;
		mergesort(a, first, mid, temp);
		mergesort(a, mid + 1, last, temp);
		mergeArray(a, first, mid, last, temp);
	}
}

bool MergeSort(int a[], int n)
{
	int* pTempArray = new int[n];
	if(pTempArray == NULL)
		return false;
	mergesort(a, 0, n-1, pTempArray);
	delete[] pTempArray;
	return true;


}

快速排序:

1、在数组取一个数作为基数

2、在L在往前查找比基数小的数,然后将此坑与基数的坑对换。

3、在R往后查找比基数大的数,然后将此坑与基数的坑对换。

4、知道LR相等时,将基数放置在L或者R处。

以下为代码:

void quickSort(int a[], int L, int R)
{
	if( L < R )
	{
		int i = L, j = R, x = a[L];

		while (i < j)
		{
			while ( i < j && a[j] >= x)
			   j--;
			if(i < j)
				a[i++] = a[j];

			while (i < j && a[i] < x)
			    i++;
			if(i < j)
				a[j--] = a[i];	
			
		}
		a[i] = x;
		quickSort(a, L, i-1);
		quickSort(a,i+1, R);
	}
}


---------------------------------------------------------------------------

java实现:

package com.example.sorts;

public class sorts {
	
	//冒泡排序
	public static void bubbleSort(int[] arr){
		int i, j;
		int len = arr.length;
		int temp;
		for(i = 0; i < len - 1; i++)
			for(j = 0; j < len - 1 - i; j++){
				if(arr[j] > arr[j+1]){
					temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
				}
			}
	}
	
	//直接插入排序
	public static void insertSort(int[] arr){
		int i, j;
		int len = arr.length;
		int temp;
		for(i = 1; i < len; i++)
			if(arr[i] < arr[i-1]){
				temp = arr[i];
				for(j = i - 1; j >= 0 && arr[j] > temp; j--)
					arr[j+1] = arr[j];
				arr[j+1] = temp;	
			}
	}
	
	//希尔排序
	public static void shellSort(int[] arr){
		int i, j;
		int gap; //间隔
		int len = arr.length;
		int temp;
		for(gap = len/2; gap > 0; gap /= 2)
			for(i = gap; i < len; i++)
				if(arr[i] < arr[i-gap]){
					temp = arr[i];
					for(j = i - gap; j >= 0 && arr[j] > temp; j -= gap)
						arr[j+gap] = arr[j];
					arr[j+gap] = temp;
				}
	}
	
	//直接选择排序
	public static void selectSort(int[] arr){
		int i, j;
		int len = arr.length;
		int temp;
		int nMinIndex;
		for(i = 0; i < len; i++){
			nMinIndex = i;
			for(j = i + 1 ; j < len ; j++)
				if(arr[nMinIndex] > arr[j])
					nMinIndex = j;
			temp = arr[nMinIndex];
			arr[nMinIndex] = arr[i];
			arr[i] = temp;
		}
	}
	
	
	//归并排序
	public static void mergeSort(int[] arr, int low, int high){
		int mid = (low + high)/2;
		if(low < high){
		mergeSort(arr, low, mid);
		mergeSort(arr, mid+1, high);
		merge(arr, low, mid, high);
		}
	}
	
	public static void merge(int[] arr, int low, int mid, int high){
		int[] temp = new int[high-low+1];
		int i = low;  //数组1的起始点
		int j = mid+1; //数组2的起始点
		int k = 0;
		
		while(i <= mid && j <= high){
			if(arr[i] < arr[j]){
				temp[k++] = arr[i++];
			}else{
				temp[k++] = arr[j++];
			}
		}
		
		while(i <= mid){
			temp[k++] = arr[i++];
		}
		
		while(j <= high){
			temp[k++] = arr[j++];
		}
		
		for(int m = 0; m < temp.length; m++)
			arr[low+m] = temp[m];
	}
	
	//快速排序
	public static void quickSort(int[] arr, int L, int R){
		if(L < R){
			int i = L, j = R;
			//选定基数
			int x = arr[i];
			while(i < j){
				
				while(i < j && arr[j] >= x)
					j--;
				if(i < j)
					arr[i++] = arr[j];
				
				while(i < j && arr[i] < x)
					i++;
				if(i < j)
					arr[j--] = arr[i];	
			}
			arr[i] = x;
			quickSort(arr, L, i-1);
			quickSort(arr, i+1, R);
		}
	}
	
	//堆排序
	
	public static void MinHeapSort(int[] arr, int n){
        int temp;
		//建立最小堆
		MakeMinHeap(arr, n);
		for(int i = n - 1; i >= 0; i--){
			temp = arr[i];
			arr[i] = arr[0];
			arr[0] = temp;
			MinHeapFixdown(arr, 0, i);
		}
	}
	
	public static void MinHeapFixdown(int[] arr, int i, int n){  //i表示节点,n表示节点数
		int j; //子节点
		int temp = arr[i];//将父节点值保存到temp
		j = 2*i + 1;
		
		while(j < n){
			if(j + 1 < n && arr[j+1] < arr[j])
				j++;
			if(temp <= arr[j])
				break;
			arr[i] = arr[j];
			i = j;    //将子节点设置为父节点
			j = 2*i + 1; //得到父节点的子节点
		}
		arr[i] = temp;
	}
	//建立最小堆
	public static void MakeMinHeap(int[] arr, int n){
		for(int i = n/2 - 1; i >= 0; i--)
			MinHeapFixdown(arr, i, n);
	}
	
	public static void main(String[] args){

		int[] arrI = {9, 12, 17, 30, 50, 20, 60, 65, 4, 49};
		MinHeapSort(arrI, 10);
		
		for(int k : arrI)
			System.out.print(k+" ");
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值