冒泡排序:
设数组长度为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+" ");
}
}