• 简单的排序算法实现


    闲来无事,简单回顾了一下排序算法

    • 简单插入排序,哈希排序
    • 冒泡排序,快速排序
    • 简单选择排序,堆排序
    #include <stdio.h>
    #include<stdlib.h>
    
    void insertSortForward(int orig[], int size);
    void insertSortBackward(int orig[], int size);
    void bubbleSort(int orig[], int size);
    void selectSort(int orig[], int size);
    void shellSort(int orig[], int size);
    void HeapSort(int orig[], int size);
    void QuickSort(int[], int, int);
    void swap(int *, int *);
    int Partition(int orig[], int left, int right);
    void BuildHeap(int orig[],int size);
    void HeapAdjust(int[], int, int);
    
    int main() {
    	int a[] = { 1,3,2,4,5,7,0,8,8 };
    	//bubbleSort(a, 7);
    	//insertSortForward(a, 8);
    	//insertSortBackward(a, 8);
    	//selectSort(a, 8);
    	//shellSort(a, 8);
    	//HeapSort(a, 9);
    	QuickSort(a, 0, sizeof(a)/sizeof(a[0])-1);
    	for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
    		printf("%d ", a[i]);
    	printf("
    ");
    	system("pause");
    	return 0;
    }
    
    void shellSort(int orig [], int size) //Shell排序
    {
    	int i, j, k, t;
    	k = (size / 2) % 2 == 0 ? size / 2 + 1 : size / 2; 
    	while (k > 0)
    	{
    		for (int j = k; j < size; j++) {
    			t = orig[j];
    			i = j - k;
    			while (i >= 0 && t < orig[i]) {
    				orig[i+k] = orig[i];
    				orig[i] = t;
    				i = i - k;
    			}
    		}
    		k /= 2;
    		if (k==0)
    		{
    			break;
    
    		}
    	}
    	for (int i = 0; i < size; i++)
    		printf("%d ", orig[i]);
    	printf("
    ");
    		
    }
    void HeapSort(int orig[], int size)
    {
    	BuildHeap(orig, size);
    	for (int i = 0; i < size; i++)
    		printf("%d ", orig[i]);
    	printf("
    ");
    	while(size > 0)
    	{
    		printf("%d ", orig[0]);
    		orig[0] = orig[ --size];
    		HeapAdjust(orig, 0,size);
    	}
    }
    void QuickSort(int orig[], int left, int right)
    {
    	if (left < right) {
    
    		int point = Partition(orig, left, right);
    		QuickSort(orig, left, point - 1);
    		QuickSort(orig, point + 1, right);
    	}
    }
    void swap(int *a, int*b) {
    	int temp;
    	temp = *a;
    	*a = *b;
    	*b = temp;
    }
    int Partition(int orig[], int left, int right)
    {
    	int prikey = orig[right]; 
    	while (left<right)
    	{
    		while (left<right&&prikey >= orig[left]) left++;
    		swap(&orig[left], &orig[right]);
    		while (left<right&& prikey <= orig[right]) right--;
    		swap(&orig[left], &orig[right]);
    	}
    	return left;
    }
    void BuildHeap(int orig[], int size)
    {
    	int k;
    	for (k=size/2-1; k>=0; k--)
    	{
    		HeapAdjust(orig, k, size);
    	}
    	
    
    }
    void HeapAdjust(int orig[], int adjustPort, int size) {
    	
    	int min;   //记录左右节点中最小的
    	int nextPoint; // 下一步
    	while (adjustPort*2+1<size-1) // 还有孩子
    	{	
    		int leftChild = adjustPort * 2+1;
    		int rightChild = adjustPort * 2 + 2;
    		min = orig[leftChild];
    		nextPoint = leftChild;
    		if (rightChild<=size-1&&orig[rightChild]<orig[leftChild])
    		{
    			min = orig[rightChild];
    			nextPoint = rightChild;
    		}
    		if (orig[adjustPort]>min)
    		{
    			orig[nextPoint] = orig[adjustPort];
    			orig[adjustPort] = min;
    			adjustPort = nextPoint;
    		}
    		else
    		{
    			break;
    		}
    	}
    }
    void insertSortForward(int orig[], int size)
    {
    	int i, j;
    	for (i = 1; i < size; i++) {
    		int temp = orig[i];
    		int index = i;
    		j = i - 1;
    		while (j >= 0 && orig[j] > temp)
    		{
    			orig[index] = orig[j];
    			index = j;
    			j--;
    		}
    		orig[j + 1] = temp;
    	}
    	for (int i = 0; i < size; i++)
    		printf("%d ", orig[i]);
    	printf("
    ");
    }
    
    void insertSortBackward(int orig[], int size) // 从后往前
    {
    	int i, j;
    	int left, right;
    	for (i = 1; i < size; i++) {
    		for (j = 0; j < i; j++) {
    			if (orig[i] <= orig[j])
    			{
    				left = orig[i];
    				right = i;
    				while (i - j)
    				{
    					orig[i] = orig[i - 1];
    					i--;
    				}
    				i = right;
    				orig[j] = left;
    			}
    		}
    		
    	}
    	for (int i = 0; i < size; i++)
    		printf("%d ", orig[i]);
    	printf("
    ");
    }
    
    void bubbleSort(int orig[], int size) {
    	int i = 0;
    	int j = 0;
    	for (i = 0; i < size; i++) {
    		for (j = 0; j < size - i; j++) {
    			if (orig[j] > orig[j + 1]) {
    				int temp = 0;
    				temp = orig[j];
    				orig[j] = orig[j + 1];
    				orig[j + 1] = temp;
    			}
    		}
    	}
    	for (int i = 0; i < size; i++)
    		printf("%d ", orig[i]);
    	printf("
    ");
    }
    
    void selectSort(int orig[], int size)
    {
    	for (int i = 0; i < size; i++) {
    		int min = orig[i];
    		int index = i;
    		for (int j = i+1; j < size; j++)
    		{
    			if (min > orig[j]) {
    				min = orig[j];
    				index = j;
    			}
    		}
    		orig[index] = orig[i];
    		orig[i] = min;
    	}
    	for (int i = 0; i < size; i++)
    		printf("%d ", orig[i]);
    	printf("
    ");
    }
    
  • 相关阅读:
    mysql 查询优化
    图解Java常用数据结构(一)
    mybatis 详解(五)------动态SQL
    Mybatis的ResultMap的使用
    java系统变慢的优化简略步骤
    mysql基本操作
    mysql数据库的优化 一
    tomcat的启动启动与关闭
    vueJs的简单入门以及基础语法
    Oracle常用命令-用户、表空间、赋权限、导入导出
  • 原文地址:https://www.cnblogs.com/liuroy/p/6220841.html
Copyright © 2020-2023  润新知